普通计算时:
N!=1*2*3*4*5*…………*N;
如果要计算N!后得到的数字,则我们可以知道其等于lgN!+1
lgN!=lg1+lg2+lg3+lg4+lg5+………………..+lgN;
但是当N很大的时候,我们可以通过数学公式进行优化:(即Stirling公式)
N!=sqrt(2*pi*N)*(N/e)^N;(pi=3.1415926=acos(-1.0),e=2.718)
lgN!=(lg(2*pi)+lgN)/2+N*(lgN-lge);
斯特林公式可以用来估算某数的大小结合lg可以估算某数的位数,或者可以估算某数的阶乘是另一个数的倍数。
51nod上一个题:
1130 N的阶乘的长度 V2(斯特林近似)
输入N求N的阶乘的10进制表示的长度。例如6! = 720,长度为3。
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 1000)
第2 - T + 1行:每行1个数N。(1 <= N <= 10^9)
Output
共T行,输出对应的阶乘的长度。
Input示例
3
4
5
6
Output示例
2
3
3
#include<iostream>
#include<cmath>
using namespace std;
#define pi 3.1415926
#define e 2.718281828459
int main(){
long long n,sum;
int t;
cin>>t;
while(t--){
cin>>n;
sum=1+0.5*log10(2*pi*n)+n*log10(n/e);
cout<<sum<<endl;
}
return 0;
}