输入N求N的阶乘的10进制表示的长度。例如6! = 720,长度为3。
Input
输入N(1 <= N <= 10^6)
Output
输出N的阶乘的长度
Sample Input
6
Sample Output
3
#include<stdio.h>
#include<math.h>
using namespace std;
#define pi 3.14159265
#define e 2.71828182
int main()
{
int n, digit;
scanf ("%d", &n);
digit= (int) ((0.5 * log (2 * pi * n) + n * log (n) - n) / log (10));
printf ("%d\n", digit + 1);
return 0;
}
斯特林公式(Stirling’s approximation)是一条用来取n的阶乘的近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特林公式十分好用,而且,即使在n很小的时候,斯特林公式的取值已经十分准确。
具体公式:n!≈√(2πn) (n/e)n,根号只作用于(2πn,后边的n是n次方。
我们对等号两边同时取以10为底的对数,则可得:(设k为n!的位数)
k-1 =log10(n!)= log10(√(2πn))+nlog10(n/e)
k为什么要减1呢?很简单,log10(10) = 1,但是10是两位数,所以我们所求的位数与实际相差1.