http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=2§ionid=2&problemid=99
题意:求N的阶乘的位数。
方法一:log10(n!)=log10(1)+log10(2)+…..+log10(n);
int getDigits(int n)
{
double sum = 0.0;
for(int i = 1;i <= n;i++)
{
sum += log10((double)i);
}
return ceil(sum); //向上取整
}
方法二:斯特林公式
两边对10取对数
log10(n!) = log10(sqrt(2 * pi * n)) + n* log10(n / e)。
#include <stdio.h>
#include <math.h>
const double PI = 3.141592653;
int main()
{
int cas,n;
double digs;
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
digs = ceil(0.5 * log10(2 * PI * n) + n * log10(double(n)) - n / log(10.0));
printf("%d\n", (int)digs);
}
return 0;
}