乘法的運算受限於資料型別的表示範圍,比如int型別的乘法,32位的無符號整形
unsigned int 最大可表示0xffffffff。
有時問題會要求我們進行較大的數值的計算,我們除了使用表示範圍較大的資料型別(事實上,這仍不可靠)外,還可以選擇高精度的乘法模擬。
例如,有這麼乙個問題:輸入乙個不超過1000的正整數n,輸出n!的精確結果。
顯然int型別來表示這個結果會產生溢位。
下面簡單講講高精度乘法的一般過程:高精度乘法要求我們開乙個陣列(假設用f[maxn]表示),用其中的每一位代表運算結果的每一位。因此,我們要對問題要求的計算結果進行分析,估算大致位數,來決定maxn的大小,就這個例子看來,最大的輸出結果1000!約有2600位,故開闢乙個3000維的陣列足夠儲存結果。
進行乘法模擬,不失一般性,取一次乘法過程來模擬,被乘數已經存放在f陣列中,乘數是x,演算法偽**如下
1 for j=1to 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...