大數加法(包括負數)
阿新 • • 發佈:2018-11-05
大數加法
多謝部落格大大的指點 :https://blog.csdn.net/u012773338/article/details/41789401
大數加法,其實就是每個數的加法,C++的程式碼好長啊,不過仔細看還是有規律的,上程式碼
#include<iostream> #include<cstring> #include<cmath> using namespace std; int main() { char x[100010],y[100010];//以字元型輸入大數x,y int a[100010]={0},b[100010]={0};//用來將大數放入int a,b 初始化為0 int size1,size2,size,flag1=0,flag2=0;//分別存x,y的長度,flag1,flag2用來判斷x,y的正負 cin>>x>>y; size1=strlen(x);size2=strlen(y); if(x[0]=='-')//x 為負數 { flag1=1; for(int i=0;i<size1-1;i++)//除負號外倒敘存放在a[]中 a[i]=x[size1-1-i]-'0'; } else//x 正數 { for(int i=0;i<size1;i++) a[i]=x[size1-1-i]-'0'; } if(y[0]=='-')//y 負數 { flag2=1; for(int i=0;i<size2-1;i++)//除負號外倒敘存放b[]中 b[i]=y[size2-1-i]-'0'; } else //y 正數 { for(int i=0;i<size2;i++) b[i]=y[size2-1-i]-'0'; } if(flag1==0 && flag2==0)//x,y都為正 { size=max(size1,size2);//找出裡面長度最大值 for(int i=0;i<size;i++)//對應 位 相加 { a[i]+=b[i]; if(a[i]>=10)//大於10進一 { a[i]-=10; a[i+1]++; } } for(int i=size;i>=0;i--)//倒敘輸出即為所求 { if(i==size&&a[i]!=0)//判斷最高位是否進一 cout<<a[i]; if(i!=size) cout<<a[i]; } cout<<endl; } if(flag1==1 && flag2==1)//x ,y 負 { size=(size1-1,size2-1); for(int i=0;i<size;i++) { a[i]+=b[i]; if(a[i]>=10) { a[i]-=10; a[i+1]++; } } cout<<"-";//提前輸出“-”號 for(int i=size;i>=0;i--) { if(i==size&&a[i]!=0) cout<<a[i]; if(i!=size) cout<<a[i]; } cout<<endl; } if(flag1==0 && flag2==1)//x正,y負 { size=max(size1,size2-1); int flagBig=0;//用來判斷大小 if(size1<size2-1) flagBig=1; else { if(size1==size2-1) { for(int i=size;i>=0;i--) { if(a[i]<b[i]) { flagBig=1; break; } } } } if(flagBig==1)//y負數大 { for(int i=0;i<size;i++) { b[i]-=a[i]; if(b[i]<0)//高位借一 { b[i]+=10; b[i+1]--; } } cout<<"-"; for(int i=size-1;i>=0;i--) { if(i==size-1&&b[i]!=0) cout<<b[i]; if(i!=size-1) cout<<b[i]; } cout<<endl; } else//x正大或相等 { for(int i=0;i<size;i++) { a[i]-=b[i]; if(a[i]<0) { a[i]+=10; a[i+1]--; } } for(int i=size-1;i>=0;i--)//一正一負的情況下最高位不可能進一,最高位為size-1 { if(i==size-1&&a[i]!=0) cout<<a[i]; if(i!=size-1) cout<<a[i]; } cout<<endl; } } if(flag1==1 &&flag2==0)//x負,y正 { int flagBig=0; size=max(size1-1,size2); if(size1-1>size2) flagBig=1; else { if(size1-1==size2) { for(int i=size;i>=0;i--) { if(a[i]>b[i]) { flagBig=1; break; } } } } if(flagBig==1)//x負大 { for(int i=0;i<size;i++) { a[i]-=b[i]; if(a[i]<0) { a[i]+=10; a[i+1]--; } } cout<<"-"; for(int i=size-1;i>=0;i--) { if(i!=size-1) cout<<a[i]; if(i==size-1&& a[i]!=0) cout<<a[i]; } cout<<endl; } else//y正大或相等 { for(int i=0;i<size;i++) { b[i]-=a[i]; if(b[i]<0) { b[i]+=10; b[i+1]--; } } for(int i=size-1;i>=0;i--) { if(i!=size-1) cout<<b[i]; if(i==size-1&& b[i]!=0) cout<<b[i]; } cout<<endl; } } return 0; }
應該是能看懂的,覺得已經很好理解了
但有一個問題 51nod 裡面 1005過不了
還請各位大佬指教