1. 程式人生 > >高精度計算(二)高精加

高精度計算(二)高精加

高精度加法……

高精加是高精中比較簡單的一類

模擬小學一年級第二學期加法內容即可


就像這樣

需要注意的地方陣列倒序儲存

因為無法預知加法結果的長度 如果正著儲存會導致向前(向左)進位可能沒有空間進位

所以最方便的方法就是倒著儲存

舉個荔枝

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。