Input
第1行:大数A 第2行:大数B (A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586 468711654886
Output示例
537643802472
代码写的好长:需要注意得是A或B为负数的情况。其中为负数的情况,要比较2者绝对值的大小,让绝对值大的减小的,如果负数的长度-1(符号占一位,要减1) 大于正数的,肯定负数的绝对值大。第二是:当长度相等的时候,比较2者绝对者大小。基本上就是这个想法,重复运算挺多的,考虑细节,WA了好多次.55555555555555555
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; char a[10050],b[10050]; int numa[10050],numb[10050]; int i,j; int add(int lena,int lenb) { for(i=lena-1,j=1;i>=0;i--) numa[j++]=a[i]-'0'; for(i=lenb-1,j=1;i>=0;i--) numb[j++]=b[i]-'0'; for(i=1;i<=10050;i++) { numa[i]+=numb[i]; if(numa[i]>=10) { numa[i]-=10; numa[i+1]++; } } for(i=10050;i>=1&&numa[i]==0;i--); if(i==0) { cout<<0<<endl; return 0; } for(;i>=1;i--) cout<<numa[i]; } int reducea(int lena,int lenb) { int flag=0; for(i=lena-1,j=1;i>=1;i--) numa[j++]=a[i]-'0'; for(i=lenb-1,j=1;i>=0;i--) numb[j++]=b[i]-'0'; if(lena-1>lenb) flag=1; if(lena-1==lenb) { for(i=lenb;i>=1;i--) { if(numa[i]==numb[i]) continue; if(numa[i]<numb[i]) { flag=0; break; } else { flag=1; break; } } } for(i=1;i<=10050;i++) { if(flag==0) { numb[i]-=numa[i]; if(numb[i]<0) { numb[i]=numb[i]+10; numb[i+1]--; } } if(flag==1) { numa[i]-=numb[i]; if(numa[i]<0) { numa[i]=numa[i]+10; numa[i+1]--; } } } if(flag==1) { for(i=10050;i>=1&&numa[i]==0;i--); if(i==0) { cout<<0<<endl; return 0; } cout<<"-"; for(;i>=1;i--) cout<<numa[i]; } else { for(i=10050;i>=1&&numb[i]==0;i--); if(i==0) { cout<<0; return 0; } for(;i>=1;i--) cout<<numb[i]; } } int reduceb(int lena,int lenb) { int flag=0; for(i=lena-1,j=1;i>=0;i--) numa[j++]=a[i]-'0'; for(i=lenb-1,j=1;i>=1;i--) numb[j++]=b[i]-'0'; if(lenb-1>lena) flag=1; if(lenb-1==lena) { for(i=lena;i>=1;i--) { if(numa[i]==numb[i]) continue; if(numb[i]<numa[i]) { flag=0; break; } else { flag=1; break; } } } for(i=1;i<=10050;i++) { if(flag==0) { numa[i]-=numb[i]; if(numa[i]<0) { numa[i]=numa[i]+10; numa[i+1]--; } } if(flag==1) { numb[i]-=numa[i]; if(numb[i]<0) { numb[i]=numb[i]+10; numb[i+1]--; } } } if(flag==1) { for(i=10050;i>=1&&numb[i]==0;i--); if(i==0) { cout<<0; return 0; } cout<<"-"; for(;i>=1;i--) cout<<numb[i]; } else { for(i=10050;i>=1&&numa[i]==0;i--); if(i==0) { cout<<0; return 0; } for(;i>=1;i--) cout<<numa[i]; } } void reduce(int lena,int lenb) { for(i=lena-1,j=1;i>=1;i--) numa[j++]=a[i]-'0'; for(i=lenb-1,j=1;i>=1;i--) numb[j++]=b[i]-'0'; for(i=1;i<=10050;i++) { numa[i]+=numb[i]; if(numa[i]>=10) { numa[i]-=10; numa[i+1]++; } } for(i=10050;i>=1&&numa[i]==0;i--); cout<<"-"; for(;i>=1;i--) cout<<numa[i]; } int main() { int i,j; cin>>a>>b; int lena=strlen(a); int lenb=strlen(b); if(a[0]!='-'&&b[0]!='-') add(lena,lenb); else if(a[0]!='-'&&b[0]=='-') { reduceb(lena,lenb); } else if(a[0]=='-'&&b[0]!='-') { reducea(lena,lenb); } else { reduce(lena,lenb); } return 0; }