大整數乘法

2021-08-20 21:49:00 字數 1745 閱讀 1532

描述

求兩個不超過200位的非負整數的積。

輸入有兩行,每行是乙個不超過200位的非負整數,沒有多餘的前導0。

輸出一行,即相乘後的結果。結果裡不能有多餘的前導0,即如果結果是342,那麼就不能輸出為0342。

樣例輸入

12345678900

98765432100

樣例輸出

1219326311126352690000
解題思路

用unsigned an1[200]和unsigned an2[200]分別存放兩個乘數,用aresult[400]來存放積。計算的中間結果也都存在aresult中。aresult長度取400是因為兩個200位的數相乘,積最多會有400位。an1[0], an2[0], aresult[0]都表示個位。

乙個數的第i位和另乙個數的第j位相乘所得的數,一定是要累加到結果的第i+j位上。這裡i, j都是從右往左,從0開始數。計算的過程基本上和小學生列豎式做乘法相同。為程式設計方便,並不急於處理進製,而將進製問題留待最後統一處理。

現以 835×49為例來說明程式的計算過程。

先算835×9。5×9得到45個1,3×9得到27個10,8×9得到72個100。由於不急於處理進製,所以835×9算完後,aresult如下:

接下來算4×5。此處4×5的結果代表20個10,因此要 aresult[1]+=20,變為:

再下來算4×3。此處4×3的結果代表12個100,因此要 aresult[2]+= 12,變為:

最後算 4×8。此處4×8的結果代表 32個1000,因此要 aresult[3]+= 32,變為:

乘法過程完畢。接下來從 aresult[0]開始向高位逐位處理進製問題。aresult[0]留下5,把4加到aresult[1]上,aresult[1]變為51後,應留下1,把5加到aresult[2]上……最終使得aresult裡的每個元素都是1位數,結果就算出來了:

//下面的迴圈統一處理進製問題

int nhighestpos = 0;

for( i = 0; i < max_len * 2; i ++ )

if( aresult[i] ) nhighestpos = i;

} for( i = nhighestpos; i >= 0; i -- )

printf("%d", aresult[i]);

return 0;

}

大整數乘法

參考 http hi.baidu.com operationsystem blog item 6e45dd1af1acadf3ae51330b.html 在計算機中,長整型 long int 變數的範圍是 2147483648 至 2147483647,因此若用長整型變數做乘法運算,乘積最多不能超過...

大整數乘法

問題描述 by 計算機演算法設計與分析 王曉東 p17 通常,在分析乙個演算法的計算複雜性時,都將加法和乘法運算當作是基本運算來處理,即將執行一次加法或乘法運算所需的計算時間當作乙個僅取決於計算機硬體處理速度的常數。這個假定僅在計算機硬體能對參加運算的整數直接表示和處理時才是合理的。然而,在某些情況...

大整數乘法。

include using namespace std int multi int num1,int size1,int num2,int size2 int size size1 size2 int ret new int size int i 0 for i 0 iret i 0 for i 0...