1066 - 大大的求和
小明在做小红给他出的算术题加法题,但是小红为了治一治小明懒惰的毛病,给他出的数都很大,这下小明郁闷了,想请你帮忙。
Input
输入的第一行是一个正整数N,表示一共有N组测试数据。
每组数据由1~100行正整数组成,每行正整数的长度不大于100位。
当输入0时,表示此组数据输入完毕。
Output
对于每组输入数据,输出所有数字的总和。每两组输出数据之间有一个空行。
Examples
Input
2 123456789012345678901234567890 123456789012345678901234567890 123456789012345678901234567890 0 12 34 0
Output
370370367037037036703703703670 46
Solution C
#include<stdio.h> #include<string.h> void Add(char *str1,char *str2,char *str3) { int i,j,i1,i2,tmp,carry; int len1=strlen(str1),len2=strlen(str2); char ch; i1=len1-1; i2=len2-1; j=carry=0; for(;i1>=0&&i2>=0;++j,--i1,--i2) { tmp=str1[i1]-'0'+str2[i2]-'0'+carry; carry=tmp/10; str3[j]=tmp%10+'0'; } while(i1>=0) { tmp=str1[i1--]-'0'+carry; carry=tmp/10; str3[j++]=tmp%10+'0'; } while(i2>=0) { tmp=str2[i2--]-'0'+carry; carry=tmp/10; str3[j++]=tmp%10+'0'; } if(carry) str3[j++]=carry+'0'; str3[j]='\0'; for(i=0,--j;i<j;++i,--j) { ch=str3[i]; str3[i]=str3[j]; str3[j]=ch; } } int main() { int n,c=0; char s1[205],s2[205],r[205]; scanf("%d",&n); while(n--) { if(c++) printf("\n"); s1[0]='0'; s1[1]='\0'; while(scanf("%s",s2),strcmp(s2,"0")) { Add(s1,s2,r); strcpy(s1,r); } puts(r); } return 0; }
Solution C++
#include<stdio.h> #include<string.h> void Add(char *str1,char *str2,char *str3) { int i,j,i1,i2,tmp,carry; int len1=strlen(str1),len2=strlen(str2); char ch; i1=len1-1; i2=len2-1; j=carry=0; for(;i1>=0&&i2>=0;++j,--i1,--i2) { tmp=str1[i1]-'0'+str2[i2]-'0'+carry; carry=tmp/10; str3[j]=tmp%10+'0'; } while(i1>=0) { tmp=str1[i1--]-'0'+carry; carry=tmp/10; str3[j++]=tmp%10+'0'; } while(i2>=0) { tmp=str2[i2--]-'0'+carry; carry=tmp/10; str3[j++]=tmp%10+'0'; } if(carry) str3[j++]=carry+'0'; str3[j]='\0'; for(i=0,--j;i<j;++i,--j) { ch=str3[i]; str3[i]=str3[j]; str3[j]=ch; } } int main() { int n,c=0; char s1[205],s2[205],r[205]; scanf("%d",&n); while(n--) { if(c++) printf("\n"); s1[0]='0'; s1[1]='\0'; while(scanf("%s",s2),strcmp(s2,"0")) { Add(s1,s2,r); strcpy(s1,r); } puts(r); } return 0; }