大数加法

题目描述

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

输入

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

输出

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

样例输入

22222222222222222222
33333333333333333333

样例输出

 
55555555555555555555
 
本来想用一个函数来相加,但发现不能正确传递,这个问题(数组名作函数参数)下次解决。
#include <iostream>  
#include <string>  
#include <cstring>  
#include <algorithm>  
using namespace std;  
char a[205]; int la;  
char b[205]; int lb;  
char c[205]; int l;  
//int jjj(char xx[], char yy[])//不知道怎么传递,伤心  
//{  
//  int i;  
//  int x=0, y=0;  
//  for (i = l - 1; i >= 0; i--)  
//  {  
//      int s;  
//      s = xx[i] - '0' + yy[i] - '0' + x;  
//      if (s >= 10)  
//      {  
//          x = s / 10; c[i] = s % 10 + '0';  
//      }  
//  }  
//  return x;  
//}  
int main()  
{  
  
    cin >> a; cin >> b;  
    la = strlen(a);  
    lb = strlen(b);  
    l = max(la, lb);  
    int i;  
    //以下这一步,我是为了让两个字符数组的个数相同,  
    //短的字符数组,前面用0补齐  
    //同时,为了统一,两个相加的字符数组分别变为数组c和数组a  
    if (la >=lb)  
    {  
        for (i = 0; i <= la - lb - 1; i++) c[i] = '0';  
        for (i = la - lb; i < la; i++)  
            c[i] = b[i - (la - lb)];  
  
    }  
    else if (lb > la)  
    {  
        for (i = 0; i <= lb - la - 1; i++)   c[i] = '0';  
        for (i = lb - la; i < lb; i++)  c[i] = a[i - (lb - la)];  
        for (i = 0; i < lb; i++) a[i] = b[i];  
    }  
    int x = 0, y = 0;  
    memset(b, 0, sizeof(0));//数组b用来存放最终答案  
    for (i = l - 1; i >= 0; i--)//从个位开始加  
    {  
        int s;  
        s = c[i] - '0' + a[i] - '0' + x;   
        x = 0;//这一步太重要,没有这一步过不了样例:0342+888888;  
        //因为百位,8+3为11,x为1;x不清零的话,千位会变成9,但实际上应该是8  
        if (s >= 10)  
        {  
            x = s / 10; //x为要进上去的数,比如个位13,3留下,1进上  
            b[i] = s % 10 + '0';  
        }  
        else b[i] = s + '0';  
    }  
    if (x != 0)//最后1个x就是最高位的数  
    {  
        cout << x;  
        for (i = 0; i < l; i++) cout << b[i];  
    }  
    else//注意前导0的情况  
    {  
        bool f = 1;  
        for (i = 0; i < l ; i++)  
        {  
            if (f == 0) cout << b[i];//x为0,即最高为0,只后还是0的话就不要输出了  
            //f==0代表之前有一位不是0,那么后面几位都可以放心输出,比如100010  
            if (f == 1 && b[i] != '0')   
            { f = 0; cout << b[i]; }  
  
        }  
    }  
    cout << endl;  
    return 0;  
}  

 

posted on 2018-01-21 22:28  蔡军帅  阅读(103)  评论(0编辑  收藏  举报