大整數乘法題解

2021-07-09 15:23:09 字數 1644 閱讀 3199

09:

大整數乘法

總時間限制:

1000ms

記憶體限制:

65536kb

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

輸入

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

輸出

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

樣例輸入

12345678900

98765432100

樣例輸出

1219326311126352690000

** 程式設計實習2007

題解:

這道題的引數過大,甚至不能用長整型變數解決,那麼就應該使用高精度演算法。我們曾經寫過高精度加法,本題演算法只是高精度加法的延伸。

將兩個數用字串陣列讀入,再轉化成整型陣列儲存,此時儲存順序應該為倒序,即第一位用來存放個位,第二位存放十位,以此類推……(這樣的目的是在於它能方便我們進製時的資料存放),好了這裡有乙個問題,題目並沒有提到輸入資料中不是先序0(如00003、0000等),所以這裡可以新增判斷語句只擷取有意義的部分(當然也可以在計算之後判斷再最高位的數字,如果為0則不輸出)

接下來是整個演算法的核心部分!!我們知道,高精度加法是對應位相加,如果結果大於等於10則進一位,然而乘法只是加法的乙個高階形式而已,所以我們也可以將此高精度乘法轉化為多個高精度加法,即a數中的每一位數去乘b數中的每一位數,最後求和。

經過觀察,我們可以發現,當我們將某x位的數乘某y位的數時,兩個數除了最高位之外其餘位都為0,運算結果為兩數之積,而它所在的位數為x+y,用兩個for迴圈,就可以實現a數中的每一位數去乘b數中的每一位數。而得到的結果則ans[x+y]+=兩數之積 ,這樣就得到了未進製的兩大數相乘的結果(原始碼中我使用了進製,實際上可以刪除)。

最後一步,進製操作。從最低位算起

ans[i+1]=ans[i]/10;

ans[i]%=10;

輸出。ac!!喜悅!!

#include#include#include#includeint a[300],b[300],ans[1000];

int work(int n,bool t)//n輸入的字元(數字) t是否轉換成數字

int main()

int j=0,log;

while(j<=len_a+len_b-2)//進製操作

j++;

} /*if(ans[len_a+len_b-2]==0)

j--;*/

while(ans[j]==0&&j>=0)

j--;

if(j==-1)

j++;

for(int i=j;i>=0;i--)//輸出數字

printf("%c",work(ans[i],0));

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...