数的长度
时间限制:3000 ms | 内存限制:65535 KB
难度:1
- 描述
-
N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)?
- 输入
- 首行输入n,表示有多少组测试数据(n<10)
随后n行每行输入一组测试数据 N( 0 < N < 1000000 ) - 输出
- 对于每个数N,输出N!的(十进制)位数。
- 样例输入
-
3 1 3 32000
- 样例输出
-
1 1 130271
- 来源
- ACM教程
- 上传者
- rooot
- //斯特林公式:(long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 );(耗时少)
- 推导→n!的位数为[lg(n*(n-1)*(n-2)*…..*1)]+1=[lg(n)+lg(n-1)+lg(n-2) +….+lg(1)]+1 (耗时多);
-
1 #include <stdio.h> 2 #include <math.h> 3 int main() 4 { 5 int n, i, t ; 6 double d ; 7 scanf("%d", &t) ; 8 while(t--) 9 { 10 scanf("%d", &n) ; 11 d = 0.0 ; 12 for(i=1; i<=n; i++) 13 d+=log10(i) ; 14 printf("%d ", (int)d+1) ; 15 } 16 return 0 ; 17 }