3 回答

TA貢獻(xiàn)1895條經(jīng)驗 獲得超7個贊
100階乘是巨大的,確切地說是93326215443944944152681699238856266700490715968264381621468592963895217 59999322991560894146397615651828625369792082722375825118521091686400 00000000000000000000。
也許您應(yīng)該使用像GMP這樣的bignum庫。它具有出色的文檔,相當(dāng)一致的界面,速度,如果您使用的是Linux,則發(fā)行版中可能會有一個軟件包(我認(rèn)為我默認(rèn)安裝了該軟件包)

TA貢獻(xiàn)1828條經(jīng)驗 獲得超3個贊
如果您不想使用bigint庫,則使用stdlib最好的方法是使用long doubleand tgammal()from math.h:
long double fact(unsigned n)
{
return tgammal(n + 1);
}
100!在x86上(即80 bit long double),這將為您提供18位小數(shù)的精度。
確切的實現(xiàn)也不是那么復(fù)雜:
#include <math.h>
#include <stdio.h>
#include <string.h>
void multd(char * s, size_t len, unsigned n)
{
unsigned values[len];
memset(values, 0, sizeof(unsigned) * len);
for(size_t i = len; i--; )
{
unsigned x = values[i] + (s[i] - '0') * n;
s[i] = '0' + x % 10;
if(i) values[i - 1] += x / 10;
}
}
void factd(char * s, size_t len, unsigned n)
{
memset(s, '0', len - 1);
s[len - 1] = '1';
for(; n > 1; --n) multd(s, len, n);
}
int main(void)
{
unsigned n = 100;
size_t len = ceill(log10l(tgammal(n + 1)));
char dstr[len + 1];
dstr[len] = 0;
factd(dstr, len, n);
puts(dstr);
}
添加回答
舉報