高精度加法

     高精度加法模擬常規的立豎式相加方法,各位對齊,諸位相加,如果相同位數上的數字大於10

則向前一位進一

高精度加法需要注意的問題:

1、運算法則     

同傳統立豎式相加的方法,諸位對齊相加

2、進位   

  兩種策略,一種是邊計算邊進位,第二種方式,加完以後進位

  邊計算邊進位,如下圖所示:

上圖中,數組第一位存儲數的長度

最後進位,如下圖所示:

3、結果的位數確定

     被加數和加數中,取位數最大的數的長度,結果的位數,最大隻可能是最長位數+1

高精度加法,代碼實現如下:

#include <iostream>
#include <cstring>
using namespace std;
const int N =1001;
int aa[N],bb[N],cc[N]; //定義計算數和輸出結果
 
void inputNum(string ss,int a[]); //輸入需要計算的數保存到數組
void printArr(int a[]);  //輸出數組的元素
void jisuan(int a[],int b[],int c[]);
 
int main()
{
    string s1 ="36895434535";
    string s2 ="46775492743";
    inputNum(s1,aa);
    printArr(aa);
    
    inputNum(s2,bb);
    printArr(bb);
    jisuan(bb,aa,cc);
    printArr(cc);
    return 0;
}
 
void jisuan(int a[],int b[],int c[])
{
    int x =0;  //臨時保存的進位數
    int lenc =1;  //結果的開始位置
    while (lenc<=a[0] || lenc<=b[0])
    {
        c[lenc] =a[lenc]+b[lenc]+x;
        x = c[lenc]/10;
        c[lenc]%=10;
        lenc++;
    }
    c[lenc] =x;  //處理最後一個進位,結果是最大長度+1時,需要處理進位 
    
    while (c[lenc] ==0)  //求輸出的結果有幾位,賦值給結果數組的第0個元素
    {
        lenc--;
    }
    c[0]=lenc;
}
 
void inputNum(string ss,int a[])
{
    int len = ss.length();
    a[0] = len;
    for (int i=0;i<len;i++)
    {
        a[len-i] = ss[i] - 48;//字符變成數字,並且倒序存儲
    }
}
void printArr(int a[])
{
    for (int i=a[0];i>0;i--)
    {
        cout<<a[i];
    }
    cout<<endl;
}

採用最後進位時,只需要改變上面代碼中jisuan函數,代碼如下

void jisuan(int a[],int b[],int c[])
{
    int i;
    if(a[0]>b[0])  
      c[0]=a[0];
    else
      c[0]=b[0];
    for(i=1;i<=C[0];i++)
    {
        c[i]+=a[i]+b[i];
        c[i+1]+=c[i]/10;
        c[i]%=10;
    }
    if(c[c[0]+1]>0) //求結果的位數 
      c[0]++;
    
}