高精度加法模擬常規的立豎式相加方法,各位對齊,諸位相加,如果相同位數上的數字大於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]++; }