HDU 1018 阶乘的位数 stirling公式

来源:互联网 发布:mysql配置文件在哪 编辑:程序博客网 时间:2024/04/30 08:52

用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;}     


 

Accepted1018968MS200K317 B

 

 

用stirling公式  968ms-->15ms

 

 

Accepted101815MS204K357 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;}