n!结果的位数

来源:互联网 发布:淘宝助手复制宝贝 编辑:程序博客网 时间:2024/05/13 12:54

Description
对于n,求n!有多少位
Input
多组输入。每组输入包含一个整数n(1<=n<=10^6)。输入以EOF结束。
Output
对于每组输入,输出一个数表示n!有的位数
Sample Input
34
Sample Output
12
Hint
注意数据范围

——————————————————————————————————————————————

分析:可以看到n的范围很大,直接求n的阶乘再去算位数是不可能AC的。

解法一:
常规算法,n的阶乘就等于lg(1)+lg(2)+…+lg(n)取整后加1
C语言代码如下:

01#include <stdio.h>
02#include <math.h>
03int main(void)
04{
05    register int i;
06    int n;
07    double d;
08    while(scanf("%d",&n)!=EOF)
09    {
10        d=0;
11        for(i=1;i<=n;i++)
12            d+=log10(i);
13        printf("%d\n",(int) d+1);
14    }
15 }

但是提交后TLE了,原因是时间复杂度为O(n),于是改用下面的解法。

解法二:
应用stirling公式,推出计算方法,写成的C语言代码如下:

01#include <stdio.h>
02#include <math.h>
03#define PI acos(-1)
04int main(void)
05{
06    int len,N;
07    while(scanf("%d",&N)!=EOF)
08    {
09        if(N==1)
10            len=1;
11        else
12            len=(int)ceil((N*log(N)-N+log(2*N*PI)/2)/log(10));
13        printf("%d\n",len);
14    }
15 }

时间复杂度为O(1)