题意:
输出n!的位数
要点:
n!的位数=log10(n!)+1
有两种方法:
1.直接用log(n!)=log10(1)+log10(2)+……+log10(n)打表做,把1~1e7的先全算出来,这种可以做但比较慢
2.纯数学做法,用斯特林公式算出近似值,因为是求位数,近似值够用了
斯特林公式:
方法一(打表):
15131753 | Seasonal | 1423 | Accepted | 39584K | 610MS | G++ | 387B | 2016-02-01 18:02:04 |
//必须要用G++,用C++会出错
#include<stdio.h>
#include<math.h>
const int maxn = 1000000;
int num[maxn+1];//必须在外面建立数组,否则会出错
//全局变量占内存多但速度快
int main()
{
int t,i;
scanf("%d", &t);
double d=0;
for (i = 1; i <= maxn; i++)//打表
{
d+= log10(i);
num[i] = (int)d + 1;//要+1,可以从1来判断,位数和log10差1
}
while (t--)
{
scanf("%d", &i);
printf("%d\n", num[i]);
}
return 0;
}
方法二(斯特林公式):
15132048 | Seasonal | 1423 | Accepted | 204K | 0MS | C++ | 291B | 2016-02-01 20:04:29 |
#include<stdio.h>
#include<math.h>
const double e = 2.7182818284590452354, pi = 3.141592653589793239;
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int n;
scanf("%d", &n);
double num;
num = log10(2 * pi*n)/2.0 + n*log10(n / e);//斯特林公式
printf("%d\n", (int)num+1);//最后别忘+1
}
return 0;
}