题目 In many applications very large integers numbers are required. Some of these applications are using keys for secure transmission of data, encryption, etc. In this problem you are given a number, you have to determine the number of digits in the factorial of the number.
由于求n!,其数量级大,所以不能直接求出值。
考虑到一个数的位数=[log10a]+1,而对于n!,有位数=[log101+log102+…+log10n]+1,即可化简。
更进一步:《计算机程序设计艺术》中给出了另一个公式
n! = sqrt(2πn) * ((n/e)^n) * (1 + 1/(12n) + 1/(288n2) + O(1/n3))
两边对10取对数
忽略后两项,得到公式
log10(n!) = log10(sqrt(2*πn)) + n * log10(n / e)
#include<stdio.h>
#include<math.h>
main(){
int n,i,x;
double sum;
scanf("%d",&n);
while(n&&scanf("%d",&x)!=EOF){
n--;
for(sum=0,i=2;i<=x;i++)
sum+=log10((double)i);
printf("%d",(int)sum+1);
printf("\n");
}
return 0;
}
注意:
while(n&&scanf("%d",&x)!=EOF)
语句中两个条件的顺序对程序有影响。- 输出的格式,以及结束(return 0)需要规范完备。