1. 程式人生 > >大數減法C++

大數減法C++

今天訓練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;
}