1168:大整数加法
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 76804 通过数: 25726
【题目描述】
求两个不超过200位的非负整数的和。
【输入】
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
【输出】
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
【输入样例】
22222222222222222222
33333333333333333333
【输出样例】
55555555555555555555
写得很繁
肯定以字符串的形式计算和保存,输出
#include<iostream> #include<cmath> #include<cstring> char a[205],b[205],c[205];//c是计算字串 using namespace std; int main() { int m=0,n,i=0,j=0,k=0,sum; scanf("%s %s",&a,&b); while(a[i]=='0')//开始的0不计 { i++; } m=strlen(a);//字串长度 for(j=0;i<m;i++,j++)//从i开始,放在c中 c[j]=a[i]; c[j]='\0'; strcpy(a,c);//复制到a m=strlen(a);//再求长度 i=0; while(b[i]=='0')//重复上面的步骤 { i++; } n=strlen(b); for(j=0;i<n;i++,j++) c[j]=b[i]; c[j]='\0'; strcpy(b,c); n=strlen(b); if(m<n)//长的字符串放在a中,另一个在b中 { strcpy(c,a); strcpy(a,b); strcpy(b,c); sum=m; m=n; n=sum; } for(i=m-1,j=n-1;j>=0;j--,i--)//从字串的末尾开始计算,即个位开始 { if(k==1)//进位了吗 a[i]++; k=0; a[i]=a[i]-'0'+b[j]-'0';//字符相加 if(a[i]>=10){//有进位吗 a[i]=a[i]-10; k=1; } a[i]+='0';//转换为字符 } if(i>-1&&k==1)//处理最后一位的进位 { a[i]++; k=0; } if(k==1)//如果最后还有进位,如果去掉这两行,程序也能通过,但实际不正确,如789+789 printf("%d",1); printf("%s",a); return 0; }