大數乘法運算

2021-07-11 22:12:21 字數 1325 閱讀 6411

第8章課後第18題要求「程式設計計算並輸出1~40之間所有數的階乘」。40的階乘遠遠超過了長整型所能表示的範圍,因此該題目涉及到大整數的儲存和大整數乘法運算問題(也稱作高精度運算)。大整數儲存的解決方案就是把大整數儲存到乙個陣列中,每個陣列元素儲存該數的一位(也可以是多位數字)。在階乘這個問題中,階乘的值逐漸增大,變成乙個大整數,因此我們把階乘的值儲存到乙個陣列中。比如8的階乘等於40320,在陣列中的儲存如下圖所示:

陣列的第0位儲存數的個位,第1位儲存數的十位,……。那麼如何計算9的階乘呢?按照整數的原始定義,40320 = 4*10000 + 0*1000 + 3*100 + 2*10 + 0*1, 則9!= 40320*9 = 4*9*10000+ 0*9*1000 + 3*9*100 + 2*9*10 + 0*9*1,除了個位和千位,其它3個位都大於10 (十位:18,百位:27,萬位:36),比如十位是18個10,實際上是1個百加8個10,1個百應該加到百位上去,因此,向百位進製1,十位只留8。百位是27個百,加上進製1是28個百,即2個千加8個百,向千位進製2,百位留8。千位等於0加上進製2,還是2,沒有給萬位進製。萬位等於36個萬,即3個10萬加6個萬,向高位進製3,萬位留6。資料增多1位。9!= 362880,在陣列中的儲存如下圖所示:

把上述計算過程轉化為程式時,用乙個迴圈語句從個位開始執行如下幾步操作:

1.和下乙個數(上例中是9)相乘;

2.乘積和進製相加;

3.第2步的和除以10得到給高位的進製,餘數保留在該位。

具體程式如下:

#include "stdio.h"

int main()

; //儲存乙個大整數

int size=5; //數的位數

int next_num;

int i;

int c=0; //進製

printf("please input next number:") ; //輸入的乘數不能太大,否則溢位。

scanf("%d",&next_num);

for(i=0;i

=0; i--)

printf("%d ",num_array[i]);

}

在上面程式的基礎上,再加一重迴圈(next_num從2到40),num_array陣列中的數從1開始,就可以計算1~40間所有數的階乘了。請大家自己去完成該程式。

大數的基本運算 大數乘法

大數 即超過了計算機定義型別的範圍的數,如126349678984 1321656546446546546546,這種運算的結果 太大,超過了基本型別的範圍,發生溢位,這樣我們就需要運用大數的演算法來解決這個問題了。大數乘法 大數乘法 include include using namespace ...

C 實現大數乘法運算!!!!

將部落格搬至csdn 因為最近想做介面開發,所以選擇了c 這門物件導向語言,這是筆者第一次接觸物件導向程式設計,以前都是用c和彙編 usingsystem namespace語法 for i 2999,j len2 1 j 0 i j for i 2999 i 2999 len1 i 先按位處理 f...

大數運算 4 大數乘法

首先說一下乘法計算的演算法 同樣是模擬人工計算時的方法。從低位向高位乘,在豎式計算中,我們是將乘數第一位與被乘數的每一位相乘,記錄結果之後,用第二位相乘,記錄結果並且左移一位,以此類推,直到計算完最後一位,再將各項結果相加,得出最後結果。計算的過程基本上和小學生列豎式做乘法相同。為程式設計方便,並不...