求某數階乘的位數。網上比較流行的方法是取對數後硬算,卡時而過,還是有些取巧成分的。 正解可能是數論中的斯特林估算階乘法(來源為WIKI): 對這個公式取對數,可以快速得到位數,另外在比賽中進行快速估算也是比較方便的。 [cpp #include <iostream> #include <cmath> #include <iomanip> using namespace std; const double PI=acos(-1); const double e=exp(1); int main() { int testcase; cin>>testcase; while(testcase--) { int n; cin>>n; double res; if(n==1 || n==0) { cout<<"1"<<endl; } else { res=log10(sqrt(2*PI*n))+n*log10(n/e);//斯特靈公式 cout<<setiosflags(ios::fixed)<<setprecision(0)<<ceil(res)<<endl; } } return 0; }