高精度乘法

2022-09-17 14:33:09 字數 1362 閱讀 6633

乘法的運算受限於資料型別的表示範圍,比如int型別的乘法,32位的無符號整形

unsigned int 最大可表示0xffffffff

有時問題會要求我們進行較大的數值的計算,我們除了使用表示範圍較大的資料型別(事實上,這仍不可靠)外,還可以選擇高精度的乘法模擬。

例如,有這麼乙個問題:輸入乙個不超過1000的正整數n,輸出n!的精確結果。

顯然int型別來表示這個結果會產生溢位。

下面簡單講講高精度乘法的一般過程:高精度乘法要求我們開乙個陣列(假設用f[maxn]表示),用其中的每一位代表運算結果的每一位。因此,我們要對問題要求的計算結果進行分析,估算大致位數,來決定maxn的大小,就這個例子看來,最大的輸出結果1000!約有2600位,故開闢乙個3000維的陣列足夠儲存結果。

進行乘法模擬,不失一般性,取一次乘法過程來模擬,被乘數已經存放在f陣列中,乘數是x,演算法偽**如下

1 for j=1

to maxn

2int s ← f[j]*被乘數 +進製;

3 f[j] ← s % 10; //

求解每一位的值

4 進製 ← s / 10; //

求解餘數

模擬的演算法相當簡單:就是對被乘數的每一位,都乘以乘數,並加上進製(初始化為0),並更新f陣列的值。

每一遍計算完成後,f陣列中儲存的就是結果的每一位的值,當然,這裡還可以壓縮下外迴圈,因為每次f中儲存的值的有效位數是確定的,就可以根據有效位數來決定外迴圈次數,不一定要每次都執行maxn遍。

模擬方法講完了,接下來就來解決一下上面的問題,**用c++實現:

1 #include2 #include3

#define maxn 3000 //

陣列開足夠大,這裡3000即可

4using

namespace

std;

5int

f[maxn];

6int

main() 18}

19int

beg;

20for(beg = maxn; beg >= 1; --beg) //

忽略前導的0

21if(f[beg]) break;22

for(int i = beg; i >= 1; --i)

23 cout<24return0;

25 }

後記:的第一篇隨筆,隨便水一下2333

高精度減法,高精度乘法

高精度減法 oj資料偏弱如果新增乙個101 2就錯了,下面這一步是為了防止錯誤的 if a aa 0 可能出現第一位的1被借走的的情況,所以加乙個while找第乙個不是0的 while c i 0 i include include include include include include u...

高精度乘法

問題描述 給你兩個正整數a,b,計算它們的乘積。輸入格式 第一行乙個正整數a 第二行乙個正整數b 輸出格式 一行,表示a b 樣例輸入 111222333444555666777888999 999888777666555444333222111 樣例輸出 提示 a,b分別不超過100000位 ff...

高精度乘法

include include include includeusing namespace std const int maxn 5000 inline int get struct data data operator const data b for int i 1 i c.len i whi...