3 回答
TA贡献1895条经验 获得超7个赞
100阶乘是巨大的,确切地说是93326215443944944152681699238856266700490715968264381621468592963895217 59999322991560894146397615651828625369792082722375825118521091686400 00000000000000000000。
也许您应该使用像GMP这样的bignum库。它具有出色的文档,相当一致的界面,速度,如果您使用的是Linux,则发行版中可能会有一个软件包(我认为我默认安装了该软件包)
TA贡献1828条经验 获得超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位小数的精度。
确切的实现也不是那么复杂:
#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);
}
添加回答
举报