對於大數來說,乙個數的階乘是非常大的,同樣,乙個int型別的整數,他的階乘就有可能會很大。
就拿50來說,他的階乘位數是65位,就已經遠遠超過了long long int型別的最大值。這時候,我們要通過字串的方法,來進行階乘的運算。
當然,需要注意的是:
我們所求乙個數的階乘,這個數是在int範圍內的,5000的階乘位數是16326位。
其方法是:
首先,我們是可以先求一定範圍內的最大值的階乘位數,以便於申請陣列空間的確定。
對於大數問題,我們要有將大數與陣列結合的思想,可以利用類似於人工求值的方法求出有關大數的問題。
對於大數階乘來說,最重要的是如何將每個數的每位數與相對應的陣列元素儲存起來,就如算50的階乘,我們要先從1開始乘:
1*2=2,將2存到a[0]中,
接下來是用a[0]*3;
2*3=6,將6儲存在a[0]中,
接下來是用a[0]*4;
6*4=24,是兩位數,那麼24%10==4存到a[0]中,24/10==2存到a[1]中,
接下來是用a[0]*5;a[1]*5+num(如果前一位相乘結果位數是兩位數,那麼num就等於十位上的那個數字;如果是一位數,num==0)
24*5=120,是三位數,那麼120%10==0存到a[0]中,120/10%10==2存到a[1]中,120/100==1存到a[2]中,
接下來是用a[0]*3;a[1]*6+num;a[2]*6+num;
120*6=720,那麼720%10==0存到a[0]中,720/10%10==2存到a[1]中,720/100==7存到a[2]中,
...................
直到乘到50,將每一位數儲存為止。
下面是c語言**實現:
#include int main()
藍橋杯 階乘運算 大數階乘
題目問題描述 輸入乙個正整數n,輸出n 的值。其中n 123 n。演算法描述 n 可能很大,而計算機能表示的整數範圍有限,需要使用高精度計算的方法。使用乙個陣列a來表示乙個大整數a,a 0 表示a的個位,a 1 表示a的十位,依次類推。將a乘以乙個整數k變為將陣列a的每乙個元素都乘以k,請注意處理相...
大數運算之階乘
int 代表有符號整數,也就是說,用 int 宣告的變數可以是正數,可以是負數,也可以是零,但是只能是整數。標準規定 int 的最小取值範圍是 32767 到 32767。int 的取值範圍因機器而異,但是一定要大於或者等於 32767 到 32767。一般來說,int 占用乙個字的記憶體空間。因此...
9 大數,高精度計算 大數階乘
大數是演算法語言中的資料型別無法表示的數,其位數超過最大資料型別所能表示的範圍,所以,在處理大數問題時首先要考慮的是怎樣儲存大數,然後是在這種儲存方式下其處理的實現方法。一般情況下大數的儲存是採用字元陣列來儲存,即將大數當作乙個字串來儲存,而對其處理是按其處理規則在陣列中模擬實現。階乘問題比較典型,...