大數乘法
對於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 表...