大数阶乘。。(0=<n<=10000)
Striling公式可得N阶乘近似值:
所以n!的位数 f(n) = [log10(n!)]+1 = floor{ 0.5*log10(2*pi)+(0.5+n)*log10(n)-n*log10(e) }+1
#include <cstdio>
#include <cstring>
using namespace std;
int main ()
{
int a[9000];
int tmp, n, c, i, j, d;
while (scanf("%d",&n)!=EOF)
{
a[1]=1;
d=1;
for(i=2;i<=n;++i)
{
for(j=1,c=0;j<=d;++j)
{
tmp=a[j]*i+c;
a[j]=tmp%10000;
c=tmp/10000;
}
while(c>0)
{
d++;
a[d]=c%10000;
c=c/10000;
}
}
printf("%d",a[d]);
for(j=d-1;j>=1;--j)
{
printf("%04d",a[j]);
}
printf("\n");
}
return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
const double pi=3.141592653589793239;
int main()
{
int t;
cin>>t;
while (t--)
{
int n;
long double r;
cin>>n;
if(n==1)
{
cout<<'1'<<endl;
continue;
}
r=(long double)0.5*log10(2*pi)+(0.5+n)*log10((long double)n)-n*log10((long double)exp(1.0));
cout<<(long)floor(r)+1<<endl;
}
return 0;
}