51nod 1130 斯特林公式
斯特林公式(Stirling's approximation)是一条用来取n的阶乘的近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特林公式十分好用,而且,即使在n很小的时候,斯特林公式的取值已经十分准确。
所以(long)(log10(sqrt(2.0*acos(-1.0)*n))+n*(log10(n)-log10(exp(1.0)))+1)就可以求出n!的长度了。当然n=1是需要特判下。
1 #include <iostream> 2 #include <stdio.h> 3 #include <math.h> 4 #define ll long long 5 using namespace std; 6 7 int main(){ 8 int n,t; 9 scanf("%d",&t); 10 while(t--){ 11 scanf("%d",&n); 12 ll x = (ll)(log10(sqrt(2.0*acos(-1.0)*n))+n*(log10(n)-log10(exp(1.0)))+1); 13 if(n==1)x++; 14 cout << x << endl; 15 } 16 return 0; 17 }