藍橋杯 大數分塊乘法 模擬乘法

2021-06-29 11:57:56 字數 1163 閱讀 4294

對於32位字長的機器,大約超過20億,用int型別就無法表示了,我們可以選擇int64型別,但無論怎樣擴充套件,固定的整數型別總是有表達的極限!如果對超級大整數進行精確運算呢?乙個簡單的辦法是:僅僅使用現有型別,但是把大整數的運算化解為若干小整數的運算,即所謂:「分塊法」。

如圖【1.jpg】表示了分塊乘法的原理。可以把大數分成多段(此處為2段)小數,然後用小數的多次運算組合表示乙個大數。可以根據int的承載能力規定小塊的大小,比如要把int分成2段,則小塊可取10000為上限值。注意,小塊在進行縱向累加後,需要進行進製校正。

以下**示意了分塊乘法的原理(乘數、被乘數都分為2段)。

void bigmul(int x, int y, int r)

int main(int argc, char* argv)

;bigmul(87654321, 12345678, x);

printf("%d%d%d%d\n", x[0],x[1],x[2],x[3]);

return 0;

}請分析**邏輯,並推測劃線處的**。

答案寫在 「解答.txt」 檔案中

注意:只寫劃線處應該填的內容,劃線前後的內容不要抄寫。

其實就是模擬了乘法過程,從圖中可以看出,對於r4,它的本位是沒有進製的m1,對於r3,它由上一位的進製,和兩個本位組成,r2則由兩個上一位的進製和乙個本位,r1則對應了最高進製,對於本位值,需要對base取餘獲得進製之後的值,然後加上進製值除以base的值,就是真實的本位值。

這裡,題目有一點小坑,首先,中描述的是m1-m4,而題目中則是n1-n4,而且對應關係還不一樣,所以為了方便,我把那些變數都統一成中的,就好看多了,還有就是r是從0開始的。

#include#includeusing namespace std;

void bigmul(int x, int y, int r)

int main(int argc, char* argv)

; bigmul(87654321, 12345678, x);

printf("%d%d%d%d\n", x[0],x[1],x[2],x[3]);

return 0;

}

大數乘法 藍橋杯

對於32位字長的機器,大約超過20億,用int型別就無法表示了,我們可以選擇int64型別,但無論怎樣擴充套件,固定的整數型別總是有表達的極限!如果對超級大整數進行精確運算呢?乙個簡單的辦法是 僅僅使用現有型別,但是把大整數的運算化解為若干小整數的運算,即所謂 分塊法 如圖 1.jpg 表示了分塊乘...

藍橋杯 歷屆試題 大數乘法

大數乘法 對於32位字長的機器,大約超過20億,用int型別就無法表示了,我們可以選擇int64型別,但無論怎樣擴充套件,固定的整數型別總是有表達的極限!如果對超級大整數進行精確運算呢?乙個簡單的辦法是 僅僅使用現有型別,但是把大整數的運算化解為若干小整數的運算,即所謂 分塊法 如圖 1.jpg 表...

藍橋杯 階乘計算(大數乘法)

基礎練習 階乘計算 時間限制 1.0s 記憶體限制 512.0mb 問題描述 輸入乙個正整數n,輸出n 的值。其中n 1 2 3 n。演算法描述 n 可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用乙個陣列a來表示乙個大整數a,a 0 表示a的個位,a 1 表示a的十位,依次類...