這個問題是乙個朋友聊天的時候突然聊到,在計算c語言中如何計算大數的階乘。
10!在c語言完全沒問題,但是如果是100!1000!的話如何實現。當時我不加思索給出下的**:
//大數的階乘 100! 錯誤
#define _crt_secure_no_warnings
#include
#include
#include
intmain()
printf
("%d!=%d"
,n,factorial)
;system
("pause");
return0;
}
我輸入小數時,結果是沒有問題的,但是當我計算100!的時候,發現100!居然是0.這個時候我意識到是不是100!超過我設定的資料型別的範圍。但是我發現在c語言中並沒有乙個資料型別可以容納100!那麼如何解決這個問題了。
#define _crt_secure_no_warnings
#include
#include
#include
void
factorial
(int n,
char
*pout)
int arr[
256]
;int idx =1;
arr[0]
=1;//此處要注意 i從1開始
for(
int i =
1; i <= n; i++
)//如果進製大於10 要降級
while
(cry >10)
//進製到這裡如果還大於 0 證明位數要加1
if(cry >0)
arr[idx++
]= cry;
}//將陣列倒序賦值給字串
for(
int i = idx -
1; i >=
0; i--
)*pout =
'\0'
;return;}
intmain()
;int n =0;
printf
("input n:");
scanf
("%d"
,&n)
;factorial
(n, buff)
;puts
(buff)
;return0;
}
演算法分析:
100 !=
100∗99∗
98∗..
.∗
1100!=100*99*98*...*1
100!=1
00∗9
9∗98
∗...
∗1這個型別於小學計算的乘法高位等於低位的本身×被乘數加低位的進製。這個時候本身就是對得到的數求餘數,進製就是對除運算。
大數運算 7 大數階乘 求階乘
對於大數來說,乙個數的階乘是非常大的,同樣,乙個int型別的整數,他的階乘就有可能會很大。就拿50來說,他的階乘位數是65位,就已經遠遠超過了long long int型別的最大值。這時候,我們要通過字串的方法,來進行階乘的運算。當然,需要注意的是 我們所求乙個數的階乘,這個數是在int範圍內的,5...
NYOJ 28 大數階乘
題意 對於比較小的n,求其階乘的時候可以用遞迴解決。但是如果n很大的時候,比如1000,那麼n 肯定超出整形資料所能表示的範圍。因此必須採用其它方法解決,通常解決大數運算資料超出範圍的問題時採用陣列去模擬。其實求算n 可以看成是每次兩個整數相乘的過程,因此可以模擬成大數相乘的過程。只是需要增加一些變...
nyoj 28 大數階乘
就是個簡單的高精度,只是一開始我打表超記憶體了,然後用了各種技巧硬是把記憶體縮到了題目要求以下 5w kb 感覺挺爽的,如下 1 include2 include3 include4 include5 using namespace std 6 typedef long long ll 7 cons...