用Stirling公式计算n!结果的位数时,可以两边取对数,得:
log10(n!) = log10(2*PI*n)/2+n*log10(n/E);
故n!的位数为 log10(2*PI*n)/2+n*log10(n/E)+1(注意:当n=1时,算得的结果为0)
n的位数为[lg10(n)]+1
n!的位数为[lg10(n*(n-1)*(n-2)*…..*1)]+1=[lg10(n)+lg10(n-1)+lg10(n-2)+….+lg10(1)]+1
直接取LOG
#include<stdio.h>
#include<math.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,i;
double sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum+=log10(double(i));
}
printf("%d\n",(int)(sum)+1);
}
return 0;
}
Accepted | 1018 | 968MS | 200K | 317 B |
用stirling公式 968ms-->15ms
Accepted | 1018 | 15MS | 204K | 357 B |
#include<stdio.h>
#include<math.h>
int stirling(int n)
{
double PI=acos(double(-1));
double e=exp(double(1));
return int(log10(sqrt(2*PI*n))+n*log10(n/e))+1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
printf("%d\n",stirling(n));
}
return 0;
}