给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A 第2行:大数B (A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input 示例
68932147586 468711654886
Output 示例
537643802472
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1005
纯粹的模拟题,就是A和B都有可能会负数,处理有点麻烦。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10010;
char a[maxn],b[maxn];
int aa[maxn],bb[maxn];
int main()
{
// freopen("a.txt","r",stdin);
while(scanf("%s%s",a,b)!=EOF)
{
memset(aa,0,sizeof(aa));
memset(bb,0,sizeof(bb));
int l1=strlen(a),l2=strlen(b),i;
int flag1=0,flag2=0;
if(a[0]=='0'&&b[0]=='0') printf("0\n"); //特殊考虑a和b都为0的情况
else
{
if(a[0]=='-')
{
flag1=1; //判断 a是否是负数 是的话置标记
for(i=0;i<l1-1;i++) //然后 a[0]是负号可以不用处理
{
aa[i]=a[l1-i-1]-'0';
}
}
else //否则 直接转换就好
{
for(i=0;i<l1;i++)
{
aa[i]=a[l1-i-1]-'0';
}
}
if(b[0]=='-') //同理判断 b
{
flag2=1;
for(i=0;i<l2-1;i++)
{
bb[i]=b[l2-i-1]-'0';
}
}
else
{
for(i=0;i<l2;i++)
{
bb[i]=b[l2-i-1]-'0';
}
}
int s=0,ans=0; //分四种情况 分别对a,b进行处理
if(!flag1&&!flag2) //a,b都为正数
{
l1=max(l1,l2);
for(i=0;i<l1;i++)
{
bb[i]+=aa[i];
if(bb[i]>=10) { bb[i]-=10; bb[i+1]++; }
}
while(!bb[l1]) l1--;
for(;l1>=0;l1--) printf("%d",bb[l1]);
printf("\n");
}
else if(!flag1&&flag2) //a为正数,b为负数
{ //判断a,b的绝对值谁大谁小
if(l1+1>l2) ans=1; //先判断长度
else if(l1+1==l2) //长度相等,判断每一位的大小
{
for(i=l1-1;i>=0;i--)
{
if(aa[i]>bb[i]) { ans=1;break;} //当前位大于 则a>b
else if(aa[i]<bb[i]) break; //否则小于
}
}
if(ans) //a的绝对值大于b 例如332 -3 或者 332 -331
{
for(i=0;i<l1;i++) //只要循环到l1-1即可
{
aa[i]-=bb[i];
if(aa[i]<0)
{
aa[i]+=10;
aa[i+1]--;
}
}
while(!aa[l1]) l1--;
for(;l1>=0;l1--) printf("%d",aa[l1]);
printf("\n");
}
else //a的绝对值小于b
{
for(i=0;i<l2-1;i++) //循环到 l2-2 ,因为b是负数
{
bb[i]-=aa[i];
if(bb[i]<0)
{
bb[i]+=10;
bb[i+1]--;
}
}
while(!bb[l2]) l2--; //如果此时 bb变成0,比如 333 -333的情况
if(l2<0) printf("0\n"); //输出0
else
{
printf("-"); //输出负号
for(;l2>=0;l2--) printf("%d",bb[l2]);
printf("\n");
}
}
}
else if(flag1&&!flag2) //和上面同理
{
if(l2+1>l1) ans=1;
else if(l2+1==l1)
{
for(i=l2-1;i>=0;i--)
{
if(bb[i]>aa[i]) { ans=1;break;}
else if(bb[i]<aa[i])break;
}
}
if(ans)
{
for(i=0;i<l2;i++)
{
bb[i]-=aa[i];
if(bb[i]<0)
{
bb[i]+=10;
bb[i+1]--;
}
}
while(!bb[l2]) l2--;
for(;l2>=0;l2--) printf("%d",bb[l2]);
printf("\n");
}
else
{
for(i=0;i<l1-1;i++)
{
aa[i]-=bb[i];
if(aa[i]<0)
{
aa[i]+=10;
aa[i+1]--;
}
}
while(!aa[l1]) l1--;
if(l1<0) printf("0\n");
else
{
printf("-");
for(;l1>=0;l1--) printf("%d",aa[l1]);
printf("\n");
}
}
}
else if(flag1&&flag2) //同为负数
{
printf("-");
l1=max(l1,l2);
for(i=0;i<l1-1;i++)
{
bb[i]+=aa[i];
s=bb[i]/10;
bb[i]%=10;
bb[i+1]+=s;
}
while(!bb[l1]) l1--;
for(;l1>=0;l1--) printf("%d",bb[l1]);
printf("\n");
}
}
}
return 0;
}