Problem:
给定一个数,求其阶乘的位数。如输入10,它的阶乖是3628800,由7位数构成,这时你要输出7;
Solution:
解法一:暴力法
N的阶乖的位数等于LOG10(N!)=LOG10(1)+.....LOG10(N)。
解法二:斯特林公式(Stirling)
故log10(n!) = log(n!) / log(10) = ( n*log(n) - n + 0.5*log(2*π*n))/log(n);
注意:暴力法在POJ中出现TLE。
解法二:
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
const double PI = acos(-1.0);
const double LN10 = log(10.0);
double stirling(int n)
{
return ceil((n * log(double(n)) - n + 0.5 * log(2.0 * n * PI)) / LN10);
}
int main()
{
int t, n;
scanf("%d", &t);
while(t--) {
scanf("%d",&n);
printf("%d\n", n <= 1 ? 1 : (int)stirling(n));
}
return 0;
}
解法一:
#include <stdio.h>
#include <math.h>
int main(void)
{
int t, n, i;
double ans;
scanf("%d", &t);
while(t--) {
scanf("%d",&n);
ans = 0.0;
for(i=1; i<=n; i++)
ans += log10(i);
printf("%d\n", (int)ans + 1);
}
return 0;
}