描述
求两个不超过200位的非负整数的和。
输入
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
输出
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
22222222222222222222
33333333333333333333
样例输出
55555555555555555555
思路:先移位再相加。即先将短的字符串扩充到于长的字符串相等,不足得地方补'0',再立个flag,当c[i+1]大于,10的时候,flag+1,c[i+1]-=10;再判断c[0],如果c[0]=='1',则直接输出字符串c,若c[0]=='0',则需要判断什么时候c[i]不为0,从不为0的地方输出字符串c,即puts(&c[i])(或puts(c+i)),若都为0,则直接输出0。
//字符串实现
#include <stdio.h>
#include <string.h>
char a[205],b[205],c[205];
int main()
{
memset(a,0,sizeof(a));//这三个memset可要可不要
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
scanf("%s",a);
scanf("%s",b);
int l,la,lb,flag=0,i,j;
la=strlen(a);
lb=strlen(b);
if(la>lb)//移位
{
for(i=la-1,j=lb-1;j>=0;i--,j--)
b[i]=b[j];
for(i=0;i<la-lb;i++)
b[i]='0';
l=la;
}
else
{
for(i=la-1,j=lb-1;i>=0;i--,j--)
a[j]=a[i];
for(i=0;i<lb-la;i++)
a[i]='0';
l=lb;
}
for(i=l-1;i>=0;i--)//相加
{
c[i+1]=a[i]+b[i]+flag-'0';
if(c[i+1]>'9')
{
flag=1;
c[i+1]-=10;
}
else flag=0;
}
if(flag==1)c[0]='1';
else c[0]='0';
if(flag==1)puts(c);//输出
else if(flag==0)
{
for(i=0;i<=l;i++)//判断
{
if(c[i]!='0')
break;
}
if(i==l+1)printf("0");//都为0,直接输出字符串c
puts(c+i);
}
return 0;
}
//数组实现
#include <stdio.h>
#include <string.h>
char a1[205],a2[205];
int c1[205],c2[205],c3[205];
int main()
{
int i,j=0,l1,l2,flag=0;
scanf("%s%s",a1,a2);
l1=strlen(a1),l2=strlen(a2);
for(i=l1-1;i>=0;i--)
c1[j++]=a1[i]-'0';
j=0;
for(i=l2-1;i>=0;i--)
c2[j++]=a2[i]-'0';
j=0;
for(i=0;i<205;i++)
{
c1[i]+=c2[i];
if(c1[i]>9)
{
c1[i]-=10;
c1[i+1]++;
}
}
for(i=204;i>=0;i--)
c3[j++]=c1[i];
for(i=0;i<205;i++)
{
if(c3[i]!=0)flag=1;
if(flag==1)printf("%d",c3[i]);
}
if(flag==0)printf("0");
return 0;
}