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> |
03 | int 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) |
04 | int 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 | } |