大數減法C++
阿新 • • 發佈:2018-11-01
今天訓練coding能力,花了兩小時從頭編了一次大數減法,包括註釋
#include <iostream> using namespace std; int main() { string a,b;//將資料以字串形式輸入 cin>>a; cin>>b; int aa=a.size(); int bb=b.size(); int num1[100]; int num2[100]; int num3[100];//將資料儲存為陣列 if((a[0]!='-')&&(b[0]!='-')){//當a,b全是正數時 //將字串輸入陣列 for(int i=0;i<aa;i++) { num1[i]=a[i]-'0';//阿拉伯數字char轉換為int } for(int i=0;i<bb;i++) { num2[i]=b[i]-'0'; } } else if((a[0]!='-')&&(b[0]=='-'))//只有b為負數 { for(int i=0;i<aa;i++) { num1[i]=a[i]-'0'; } for(int i=1;i<bb;i++) { num2[i-1]=-(b[i]-'0'); } bb--;//減1後才是數字長度 } else if((a[0]=='-')&&(b[0]=='-'))只有a為負數時 { for(int i=1;i<aa;i++) { num1[i-1]=-(a[i]-'0'); } aa--; for(int i=1;i<bb;i++) { num2[i-1]=-(b[i]-'0'); } bb--; } else if((a[0]=='-')&&(b[0]!='-'))均為負數時 { for(int i=1;i<aa;i++) { num1[i-1]=-(a[i]-'0'); } aa--; for(int i=0;i<bb;i++) { num2[i]=(b[i]-'0'); } } int m=max(aa,bb); //將2組數變成一樣長,即短的數字為前面加0,方便計算 if(aa>bb) { for(int i=bb;i>=0;i--) num2[i+(aa-bb)]=num2[i]; for(int i=0;i<aa-bb;i++) num2[i]=0; } else{ for(int i=aa;i>=0;i--) num1[i+(bb-aa)]=num1[i]; for(int i=0;i<bb-aa;i++) num1[i]=0; } int temp[100];//copy一下num1,防止後面修改num1。 for(int i=0;i<m;i++) { temp[i]=num1[i]; } //判斷結果為正數或0 for(int i=0;i<m-1;i++) { num3[m-i-1]=temp[m-i-1]-num2[m-i-1]; if(num3[m-i-1]<0)//進位 { num3[m-1-i]=10+num3[m-i-1]; temp[m-i-2]--; } if(num3[m-i-1]>=10)//進位 { num3[m-i-1]=num3[m-i-1]-10; temp[m-i-2]++; } } num3[0]=temp[0]-num2[0];//數字的最大位代表結果的正負 if(num3[0]<0){//結果為正就不用重複計算了,為負數就計算b-a,理論上再加負號即可(這裡num3[0]=num1[0]-num2[0]使得num3[0]自帶負號,故不必再加負號) for(int i=0;i<m-1;i++) { num3[m-i-1]=num2[m-i-1]-num1[m-i-1]; if(num3[m-i-1]<0){ num3[m-1-i]=10+num3[m-i-1]; num2[m-i-2]--; } if(num3[m-i-1]>=10) { num3[m-i-1]=num3[m-i-1]-10; num2[m-i-2]++; } } num3[0]=num1[0]-num2[0]; } for(int i=0;i<m;i++) { cout<<num3[i]; } return 0; }