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