• 高精度运算之加减乘


    大数A+B A-B A*B;

    在A-B是要判断AB的大小,我们要用大数减小数;

    下面是我们oj的一个A*B的题;

    链接:http://acm.zznu.edu.cn/problem.php?id=1562

    题目描述

    Redraiment碰到了一个难题,需要请你来帮忙:给你两个整数,请你计算A × B。

    输入

    数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数。 接着有T组数据,每组数据只有一行,包括两个正整数A和B。 但A和B非常大,Redraiment能保证这些数用long来保存一定会溢出。 但A和B的位数最大不会超过100位。

    输出

    对应每组测试数据,你都要输出两行: 第一行为:"Case #:", # 代表这是第几组测试数据。 第二行是一个等式:"A * B = Sum", Sum 代表 A × B 的结果。 你要注意这个等式里包含了几个空格。 要求每组数据之间都需要保留一个空行。

    样例输入

    2
    1 2
    123456789 987654321

    样例输出

    Case 1:
    1 * 2 = 2
    
    Case 2:
    123456789 * 987654321 = 121932631112635269
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<queue>
    using namespace std;
    #define N 1100
    
    void change(char s[], int a[])///把字符串类型的s转化成数字倒着存入a中;
    {
        int j=0, len = strlen(s);
        for(int i=len-1; i>=0; i--)
        {
            a[j++] = s[i]-'0';
        }
    }
    void Add(int a[], int b[], int sum[])
    {
        for(int i=0; i<N-1; i++)
        {
            int m = sum[i]+a[i]+b[i];
            sum[i] = m%10;
            sum[i+1] += m/10;
        }
    }
    void Sub(int a[], int b[], int c[])
    {
        for(int i=0; i<N; i++)
        {
            if(a[i]-b[i] < 0)///借位;
            {
                c[i] = a[i]+10-b[i];
                a[i+1] -= 1;
            }
            else
                c[i] = a[i] - b[i];
        }
    }
    void Mul(int a[], int b[], int c[])
    {
        int m;
        for(int i=0; i<N; i++)
        {
            for(int j=0; i+j+1<N; j++)
            {
                m = a[i]*b[j];
                m+=c[i+j];
                c[i+j] = m%10;
                c[i+j+1] += m/10;
            }
        }
    }
    int main()
    {
        int T, t=1, i, f, a[N], b[N], c[N];
        char s1[N], s2[N];
        scanf("%d", &T);
        while(T--)
        {
            memset(a, 0, sizeof(a));
            memset(b, 0, sizeof(b));
            memset(c, 0, sizeof(c));
            f  =0;
            scanf("%s%s", s1,s2);
    
            int len1 = strlen(s1);
            int len2 = strlen(s2);
    
           /* if(len1<len2)
            {
                f=1;
                swap(s1, s2);
            }
            else
            {
                if(strcmp(s1, s2)<0)
                    f=1,
                    swap(s1, s2);
            }*////在减法中要用到这个;
            change(s1, a);
            change(s2, b);
    
            /// Add(a, b, c);/// +
            /*Sub(a, b, c);/// -
            if(f == 1) printf("-"); */
            Mul(a, b, c);/// *
            for(i=N-1; i>0; i--)
            {
                if(c[i]!=0)
                    break;
            }
            printf("Case %d:
    ", t++);
            printf("%s * %s = ", s1, s2);
            for(int j=i; j>=0; j--)
                printf("%d", c[j]);
            printf("
    ");
            if(T!=0)
                printf("
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    本学期的学习计划
    snmp 学习记录
    解锁树莓派root账号
    树莓派通过阿里云内网穿透,搭建下载机
    golang Ordered Map
    go 切片slice奇怪的地方
    学习scons总结
    go语言学习小结
    学习git版本管理工具
    轻松记账工程冲刺第二阶段10
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4864922.html
Copyright © 2020-2023  润新知