【字符串】【AOJ-437】高精度加法
Description
计算一组连续的非负整数的和
Input
第一行T,表示测试数据有T组
第2至K+1行:每行一个非负整数,位数在100以内,每组长整数不超过50个,每组输入以"0"结束
第2至K+1行:每行一个非负整数,位数在100以内,每组长整数不超过50个,每组输入以"0"结束
Output
每组对应一个输出,为该组数的和
Sample Input
1 123456789012345678901234567890 123456789012345678901234567890 123456789012345678901234567890 0
Sample Output
370370367037037036703703703670
Hint
整数可能以0开始
思路:
高精度加法就是模拟手算,用字符串逆序储存数字,每位相加,>=10进一位和下一位相加,要注意这题可能以0开始,即010+010 000+010等都有可能,注意处理前导0
参考代码:
#include <stdio.h> #include <string.h> char a[55][110]={0}; void add(char *a,char *b);//高精度加法 void change(char *a);//字符串倒序 void del(char *a,int n);//删除前导0 int main() { int t,k=0,i,len,flag,m; scanf("%d",&t); while(t--) { k=0; while(scanf("%s",a[k])) { flag=0; m=strlen(a[k]); if(a[k][0]=='0'&&m==1) break; if(a[k][0]=='0') { for(i=0;i<m;i++) { if(a[k][i]=='0') flag++; if(a[k][i]!='0') break; } del(a[k],flag); } change(a[k]); k++; } for(i=0;i<k;i++) add(a[i],a[i+1]); len=strlen(a[i]); for(k=len-1;k>=0;k--) printf("%c",a[i][k]); printf("\n"); } return 0; } void add(char *a,char *b) { int lena,lenb,i,num,e=0; char p[110]={0}; lena=strlen(a); lenb=strlen(b); if(lena>lenb) { for(i=0;i<lenb;i++) { num=a[i]-'0'+b[i]-'0'+e; e=num/10; p[i]=num%10+'0'; } for(;i<lena;i++) { num=a[i]-'0'+e; e=num/10; p[i]=num%10+'0'; } if(e) p[i++]=e+'0'; p[i]=0; } else { for(i=0;i<lena;i++) { num=a[i]-'0'+b[i]-'0'+e; e=num/10; p[i]=num%10+'0'; } for(;i<lenb;i++) { num=b[i]-'0'+e; e=num/10; p[i]=num%10+'0'; } if(e) p[i++]=e+'0'; p[i]=0; } strcpy(b,p); } void change(char *a) { int i,len; char temp; len=strlen(a); for(i=0;i<len/2;i++) { temp=a[i]; a[i]=a[len-1-i]; a[len-1-i]=temp; } } void del(char *a,int n) { int i,len; len=strlen(a); for(i=0;i<len-n;i++) a[i]=a[i+n]; a[i]='\0'; }