【基本算法--高精度计算】大整数相加

时间:2022-07-28 03:34:25

【题目描述】

求两个不超过200位的非负整数的和。

【输入】

有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

【输出】

一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

【输入样例】

22222222222222222222
33333333333333333333

【输出样例】

55555555555555555555

【注意】
  1.  思路看似简单,但是很多小细节需要注意
  2. 注意相加的实现,进位和该位的值,与原先的值有关的。
  3. 还可以用另一种方法,统一相加,加了之后再统一进位。
  4. #include<iostream>
    #include<string> 
    #include<string.h> 
    using namespace std;
    void initial(int a[])
    {
        string s;
        cin >> s;
        a[0] = s.length();
        for (int i = 1; i <= a[0]; i++)
        {
            a[i] = s[a[0] - i] - '0';
        }
    }
    void add(int a[], int b[], int c[])
    {
        c[0] = (a[0] >= b[0]) ? a[0] : b[0];
        for (int i = 1; i <= c[0]; i++)
        {
            /*c[i]+=(a[i]+b[i])%10;
            c[i+1]=(a[i]+b[i])/10;*/
            //这样是错的
            //首先,c[i]这一位的值应该是(c[i]+a[i]+b[i])%10,也要算上这一位本身的数的
            //其次,进位实际也要与前一位的c[i]相关,所以也要在括号内加上c[i]
            //这种方法容易写错,可以用另一种方法替代
            //每一位相加,加完了之后,再统一进位。 
            c[i + 1] = (c[i] + a[i] + b[i]) / 10;
            c[i] = (c[i]+a[i] + b[i]) % 10;
        }
        if (c[c[0] + 1] != 0)
        {
            c[0]++;
        }
    }
    int main()
    {
        int a[205], b[205], c[205];
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        memset(c, 0, sizeof(c));
        initial(a);
        initial(b);
        add(a, b, c);
        for (int i = c[0]; i > 1; i--)
        {
            if (c[i] != 0)
                break;
            c[0]--;
        }
        for (int i = c[0]; i >= 1; i--)
        {
            cout << c[i];
        }
        cout << endl;
        return 0;
    }