C语言:N!的精确值

来源:百度知道 编辑:UC知道 时间:2024/07/02 21:38:27
#include<stdio.h>
#include<math.h>
main()
{
long a[256],b,d;
int m,n,i,j,r;
scanf("%d",&n);
m=log(n)*n/6+2;
a[1]=1;
for(i=2;i<=m;i++)
a[i]=0;
d=0;
for(i=2;i<=n;i++)
{
for(j=1;j<=m;j++)
{
b=a[j]*i+d;
a[j]=b%1000000;
d=b/1000000;
}
if(d!=0)
a[j]=d;
}

for(i=m;i>=1;i--)
if(a[i]=0)
continue;
else
{
r=i;
break;
}
printf("%d ! =",n);
printf("%d ",a[r])

这个是和一个定理相关的,弄这定理的那个老外,我忘记他叫啥啦。

目的是:大概的估算一下n的阶乘结果十进制表示,会有多少位。

比如10的阶乘,结果大概log(10)*10位个数字。
上面用log(n)*n/6+2,其中/6是因为算法中每个数组单元,存放小于1000000(6个零)的整数,即m=log(n)*n/6后,从1到m每个元可表示十进制的6位数。+2为是了保险一点。你+3或+更多也成....不过就是浪费些空间

这有个ppt有提到,teacher.swun.edu.cn/teacher_manage/upload/200706061549391831.ppt

你看下

LOG是数学函数