2012 藍橋杯 初賽試題 大數乘法

2021-06-20 22:28:02 字數 1737 閱讀 7743

大數乘法

對於32

位字長的機器,大約超過

20億,用

int型別就無法表示了,我們可以選擇

int64

型別,但無論怎樣擴充套件,固定的整數型別總是有表達的極限!如果對超級大整數進行精確運算呢?乙個簡單的辦法是:僅僅使用現有型別,但是把大整數的運算化解為若干小整數的運算,即所謂:「分塊法」。

如圖【1.jpg

】表示了分塊乘法的原理。可以把大數分成多段(此處為

2段)小數,然後用小數的多次運算組合表示乙個大數。可以根據

int的承載能力規定小塊的大小,比如要把

int分成

2段,則小塊可取

10000

為上限值。注意,小塊在進行縱向累加後,需要進行進製校正。

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

2段)。

#include

#include

using 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]);

system("pause");

return 0; }

解題思路:

不算難,就是類似平時乘法運算中的進製

按照它的演算法,99*99應該是這個樣子

99*99正常方法:

99x99

---------

891891

---------

9801

99*99用題中敘述的方法:

99x99

---------

8181

8181

---------

9  8  0 1

假設9為r[0],8、0、1分別是r[1]、r[2]、r[3],四個81分別是n1,n2、n3、n4。

則r[3]=n1%10;

r[2]=n1/10+n2%10+n3%10;

r[1]=n4%10+n2/10+n3/10;

r[0]=n4/10;

得到了上面的一組結果,很容易就推出了空格1,空格二就是簡單的進製加減了,嘿嘿,分值到手!

[cpp]view plain

copy

#include 

#include 

using

namespace

std;  

void

bigmul(

intx, 

inty, 

intr)  

intmain(

intargc, 

char

* argv)  

;  bigmul(87654321, 12345678, x);  

printf("%d%d%d%d\n"

, x[0],x[1],x[2],x[3]);  

system("pause"

);  

return

0;  

}  

2012藍橋杯 初賽試題 奪冠概率

題目描述 足球比賽具有一定程度的偶然性,弱隊也有戰勝強隊的可能。假設有甲 乙 丙 丁四個球隊。根據他們過去比賽的成績,得出每個隊與另乙個隊對陣時取勝的概率表 甲 乙 丙 丁 甲 0.1 0.3 0.5 乙 0.9 0.7 0.4 丙 0.7 0.3 0.2 丁 0.5 0.6 0.8 資料含義 甲對...

2012藍橋杯 初賽試題 古堡算式

題目描述 福爾摩斯到某古堡探險,看到門上寫著乙個奇怪的算式 abcde edcba 他對華生說 abcde應該代表不同的數字,問號也代表某個數字!華生 我猜也是!於是,兩人沉默了好久,還是沒有算出合適的結果來。請你利用計算機的優勢,找到破解的答案。把 abcde 所代表的數字寫出來。答案寫在 解答....

藍橋杯 歷屆試題 大數乘法

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