大数加法,算是大数运算里最简单的,注意进位就OK了。
思路大概是用字符串储存大数,然后把大数倒置并用整型数组储存,然后位对位加起来就行了。
但这个题会有一些很刁钻的数据比如:00000+000,00001+00100等等类似的数据所以还需要在处理基本的加法前,把无意义的0去掉,这一步可以加在储存大数的倒置之前,也可以加在最终输出和的过程中(因为这些无意义的0对加法本身没有影响,但如果是减法的话,就必须提前去0)。
代码(可能比较麻烦,有时间优化一下):
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char a[1010],b[1010];
int n1[1010],n2[1010],s[1010];
int main()
{
int t=0,n,m,i,j;
scanf("%d", &n);
while(n--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(n1,0,sizeof(n1));
memset(n2,0,sizeof(n1));
memset(s,0,sizeof(s));
scanf("%s %s", &a, &b);
int l1, l2, num = 0;
l1 = strlen(a);
l2 = strlen(b);
for(i=0; i<l1; i++)
{
n1[i] = a[l1-1-i] - 48;
}
for(i=0; i<l2; i++)
{
n2[i] = b[l2-1-i] - 48;
}
if(l1==l2)
{
for(i=0; i<l1; i++)
{
s[i] += n1[i] + n2[i];
if(s[i] > 9)
{
s[i+1] += s[i]/10;
s[i] %= 10;
if(i == l1-1)
num++;
}
num++;
}
}
else if(l1 > l2)
{
for(i=0; i<l2; i++)
{
s[i] += n1[i] + n2[i];
if(s[i] > 9)
{
s[i+1] += s[i]/10;
s[i] %= 10;
}
num++;
}
while(i < l1)
{
s[i] += n1[i];
if(s[i] > 9)
{
s[i+1] += s[i]/10;
s[i] %= 10;
if(i == l1-1)
num++;
}
num++;
i++;
}
}
else
{
for(i=0; i<l1; i++)
{
s[i] += n1[i] + n2[i];
if(s[i] > 9)
{
s[i+1] += s[i]/10;
s[i] %= 10;
}
num++;
}
while(i < l2)
{
s[i] += n2[i];
if(s[i] > 9)
{
s[i+1] += s[i]/10;
s[i] %= 10;
if(i == l2-1)
num++;
}
num++;
i++;
}
}
printf("Case %d:\n", ++t);
printf("%s + %s = ", a, b);
bool flag = false;
for(i=num-1; i>=0; i--)
{
if(s[i] != 0 && !flag)
flag = true;
else if(s[i] == 0 && !flag)
continue;
cout << s[i];
}
if(!flag)
cout << '0';
cout << endl;
if(n)
cout << endl;
}
return 0;
}