http://poj.org/problem?id=1423
方法一:斯特林公式:这个公式在计算N!时很方便。然后直接调用log10(n!)=log10(1)+……log10(n)。将这个公式代入就行
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
double pi=acos((double)-1),e=exp((double)1);
int main()
{
int n,m;
double ans;
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
ans=0.5*(log10(2*pi*m))+m*(log10(m/e));
m=(int)ans+1;
printf("%d\n",m);
}
return 0;
}
方法二:直接调用og10(n!)=log10(1)+……log10(n),进行打表。
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
#define M 10000001
int a[10000001];
void plist()
{
int plen,i,j;
memset(a,0,sizeof(a));
double s;
s=0;
for(i=1;i<=M;i++)
{
s+=log10((double)i);
a[i]=(int)s+1;
}
}
int main()
{
int n,i,j,m;
while(~scanf("%d",&n))
{
plist();
for(i=0;i<n;i++)
{
scanf("%d",&m);
printf("%d\n",a[m]);
}
}
}