51nod 1005 大数加法
给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A 第2行:大数B (A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586 468711654886
Output示例
537643802472
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; char s1[10010],s2[10010],ss1[10010],ss2[10010]; int len1,len2,a[10010],b[10010],c[10010]; bool f1,f2; void add(int *k1,int *k2) { c[0]=max(k1[0],k2[0]); for(int i=1;i<=c[0];i++) { c[i+1]=(k1[i]+k2[i]+c[i])/10; c[i]=(c[i]+k1[i]+k2[i])%10; } if(c[c[0]+1]) c[0]++; for(int i=c[0];i;i--) printf("%d",c[i]); } void sub(int *k1,int *k2) { c[0]=k1[0];int x=0; for(int i=1;i<=c[0];i++) { if(k1[i]<k2[i]) { k1[i]+=10; k1[i+1]--; } c[i]=k1[i]-k2[i]; } while(!c[c[0]]&&c[0]>1) c[0]--; for(int i=c[0];i;i--) printf("%d",c[i]); } int main() { scanf("%s",s1); scanf("%s",s2); len1=strlen(s1); len2=strlen(s2); int i=0,j=0; if(s1[i]=='-') f1=true,i++; if(s2[j]=='-') f2=true,j++; int x1=0,y1=0; for(int x=i;x<len1;x++) ss1[x1++]=s1[x]; for(int y=j;y<len2;y++) ss2[y1++]=s2[y]; int x2=0,y2=0; for(int x=len1-1;x>=i;x--) a[++x2]=s1[x]-'0'; for(int y=len2-1;y>=j;y--) b[++y2]=s2[y]-'0'; a[0]=x2;b[0]=y2; if(f1==f2) { if(f1) putchar('-'); add(a,b); } else if(f1) { if(strlen(ss1)==strlen(ss2)&&strcmp(ss1,ss2)>0||strlen(ss1)>strlen(ss2)) { putchar('-'); sub(a,b);} else sub(b,a); } else { if(strlen(ss1)==strlen(ss2)&&strcmp(ss1,ss2)>=0||strlen(ss1)>strlen(ss2)) sub(a,b); else { putchar('-'); sub(b,a); } } }
错误1:
加法中:c[i]=(c[i]+k1[i]+k2[i])%10;
写成 c[i]+=(k1[i]+k2[i])%10;
可能会使c[i]=10
错误2:
加法中
c[i+1]=(k1[i]+k2[i]+c[i])/10;
c[i]=(c[i]+k1[i]+k2[i])%10;
顺序颠倒
错误3:
减法比较大小直接写strcmp(ss1,ss2)>0,错误
因为strcmp的比较原则是逐位比较,所以要先判断长度