高精度計算(二)高精加
阿新 • • 發佈:2019-01-25
高精度加法……
高精加是高精中比較簡單的一類
模擬小學一年級第二學期加法內容即可
就像這樣
需要注意的地方陣列倒序儲存
因為無法預知加法結果的長度 如果正著儲存會導致向前(向左)進位可能沒有空間進位
所以最方便的方法就是倒著儲存
再舉個荔枝:
99 + 12
先讀入 後處理
3 2 1
9 9
1 2 就是
1:9+2向左進位然後此位留下(9 + 2) % 10 = 1再算
2:9 + 1 再加上剛剛進的1 也就是9 + 1 + 1 繼續進位 留下(9 + 1 + 1) % 10 = 1
這時候發現有效位數已經處理完 但是還有(9 + 1 + 1) / 10的餘數x不為0 好的進一位
得到有效位數3: 留下1 % 10 = 1
得到答案111
上面的模擬中容易發現a位數的數+b位數的數可能是max(la,lb)或是max(la,lb)+1
所以實現的時候不妨設答案長度為max(la,lb) 如果有效位數處理完之後餘數不為0
那麼可以len++(因為我們是倒著儲存的)再把餘數存到ans[len]中
核心程式碼
1.初始化
使用字串讀入 如scanf("%d",s);或scanf("%d",s+1);
la = strlen(s); 或 la = strlen(s+1);
利用for(int i=1;i<=la;i++)n1[la-i+1] = s[i]-'0';來實現對數字的倒序儲存(習慣從 1 開始)
2.模擬加法
註釋很詳細
int add(int a[],int la,int b[],int lb,int c[])
//這裡傳進去的引數比較多 主要是方便運算
{
int l=max(la,lb),x=0;
//l為答案的長度,x是餘數
for(int i=1;i<=l;i++){
c[i]=a[i]+b[i]+x;//豎式上下加上小下標
x=c[i]/10;//計算進位
c[i]%=10;//計算留下來的
}
if(x!=0)c[++l]=x;//長度需要加1
return l;//返回答案的長度 便於輸出答案
}
呼叫:int len = add( a , la , b , lb , ans );3.輸出
for(int i = len ;i >= 1;i--)
printf("%d" ,ans[i]);
歡迎指出Bug
End。