#include<bits/stdc++.h> #include<cmath> #define mem(a,b) memset(a,b,sizeof a) #define INF 0x3f3f3f3f using namespace std; typedef long long ll; /* (floor) (log10(N)) + 1; // 求一个数的位数 log10(n!) // 常规方法 =log10(1*2*3…*n)=log10(1*2*3…*n) =log10(1)+log10(2)+…+log10(n) log10(n!) // 斯特林公式 =log10(sqrt(2*pi*n))+n*log10(n/e) */ int digit_stirling(int n) // 斯特林公式 { double PI=acos(double(-1)); // PI的值==反余弦函数 -1.0为Pi,1为0。 double e=exp(double(1)); // e的值 return floor(log10(sqrt(2*PI*n))+n*log10(n/e))+1; } int digit_log10(int n) // 常规方法 { double cnt=0; for(int i=1;i<=n;i++) cnt+=(log10(i)); cnt=(floor)(cnt)+1; return cnt; } int main() { int n; while(~scanf("%d",&n)) { int rs=digit_stirling(n); printf("digit_stirling == %d\n",rs); rs=digit_log10(n); printf("digit_log10 == %d\n",rs); } return 0; }