#include<iostream> #include<string> using namespace std; #define MAXN 10001 int a[MAXN]={0},b[MAXN]={0}; bool init(int a[]) { int i; string s; cin>>s; a[0]=s.length(); if(s[0]=='-') { //a[0]--; for(i=1;i<=a[0];i++) a[i]=s[a[0]-i]-'0'; a[a[0]]=0; a[0]--; return false; } else { for(i=1;i<=a[0];i++) a[i]=s[a[0]-i]-'0'; return true; } } void print(int a[]) { int i; if (a[0]==0){cout<<0<<endl;return;} for(i=a[0];i>0;i--) cout<<a[i]; cout<<endl; return ; } void jia(int a[],int b[]) { int i,k; if(a[0]<b[0])a[0]=b[0]; for(i=1;i<=a[0];i++) a[i]+=b[i]; for(i=1;i<=a[0];i++) { a[i+1]+=a[i]/10; a[i]%=10; } if(a[a[0]+1]>0) a[0]++; } int compare (int a[],int b[]) { int i; if (a[0]>b[0]) return 1;//a的位数大于b则a比b大 if (a[0]<b[0]) return -1;//a的位数小于b则a比b小 for(i=a[0];i>0;i--) //从高位到低位比较 { if (a[i]>b[i]) return 1; if (a[i]<b[i]) return -1; } return 0;//各位都相等则两数相等。 } int jian(int a[],int b[])//计算a=a-b { int flag,i; flag=compare(a,b); //调用比较函数判断大小 if (flag==0) {a[0]=0;return 1;} //相等 if(flag==1) //大于 { for(i=1;i<=a[0];i++) { if(a[i]<b[i]){ a[i+1]--;a[i]+=10;} //若不够减则向上借一位 a[i]=a[i]-b[i]; } while(a[a[0]]==0) a[0]--; //修正a的位数 return 1; } if (flag==-1)//小于 则用a=b-a,返回-1 { for(i=1;i<=b[0];i++) {if(b[i]<a[i]){b[i+1]--;b[i]+=10;} //若不够减则向上借一位 a[i]=b[i]-a[i]; } a[0]=b[0]; while(a[a[0]]==0) a[0]--; //修正a的位数 return -1; } } int main() { bool signa=false,signb=false; signa = init(a); signb = init(b); if(signa&&signb) { jia(a,b); print(a); } else if(!signa&&!signb) { jia(a,b); printf("-"); print(a); } else { if(jian(a,b)==1) { if(!signa&&a[0]) cout<<'-'; } else { if(!signb&&a[0]) cout<<'-'; } print(a); } return 0; }
大数加法