大数加法(大数问题)
题目描述
求两个不超过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; }