對于大于 16 的數字,我對階乘函式的表面實作通常會失敗。
#include <stdio.h>
int fact(int x){
if (x==1)
return 1;
else
return (x* fact(x-1));
}
int main() {
int x;
scanf("%d", &x);
printf("%d\n", fact(x));
}
這是否取決于這樣一個事實,即在遞回的某個點,整數將無法根據 表示sizeof(int)?
uj5u.com熱心網友回復:
或多或少,但限制不應該是 16。
當整數為 32 位大時,可表示的最高階乘為
fact(12) = 479001600 = 0x1c8cfc00
(接下來是fact(13) = 6227020800 = 0x17328cc00)
對于 64 位整數,可表示的最高階乘是
fact(20) = 2432902008176640000 = 0x21c3677c82b40000
(接下來是fact(21) = 51090942171709440000 = 0x2c5077d36b8c40000)
16 應該是僅在 AFAIK 不常見的 48 位系統(6 位元組)上的限制......
uj5u.com熱心網友回復:
所以在你的平均系統上 anint代表 4 個位元組。
可表示的最大有符號數是2147483647。大于階乘 12 的值超過此數字,因此將無法存盤在 4 個位元組中。
它一直作業到階乘 16 的事實可能表明您int表示 6 位元組,這將是罕見的。
您可以選擇采用long,long long或unsigned資料型別,這通常允許您存盤更大的正數。
uj5u.com熱心網友回復:
這是否取決于這樣一個事實,即在遞回的某個點,整數將無法根據 sizeof(int) 表示?
是的。因子變得非常大非常快,并且會超過N > 20的本機整數型別的范圍。要計算任何超出的范圍,20!您將需要使用任意精度數學庫,如GNU GMP:
#include <gmp.h>
...
for ( unsigned int i = 0; i < 100; i )
{
mpz_t result;
mpz_fac_ui( result, i );
gmp_printf( "%3u! = %Zd\n", i, result );
}
順便說一句,雖然階乘的定義是遞回的 - N!= N * (N-1)!, 0! = 1 - 最好使用類似的迭代演算法來解決
unsigned long fac( unsigned long n )
{
unsigned long ret = 1;
while( n )
ret *= n--;
return ret;
}
uj5u.com熱心網友回復:
#include <stdio.h>
無符號整數階乘(無符號整數 n){
if (n == 0)
return 1;
return n * factorial(n - 1);
}
int main() {
int num = 5;
printf("Factorial of %d is %d",
num, factorial(num));
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/324791.html
上一篇:強制最多一次包含在嵌入式C中
