【再谈阶乘的近似解】HDU 1018——Big Number
题目链接:点击打开链接
求某数阶乘的位数。网上比较流行的方法是取对数后硬算,卡时而过,还是有些取巧成分的。
正解可能是数论中的斯特林估算阶乘法(来源为WIKI):

对这个公式取对数,可以快速得到位数,另外在比赛中进行快速估算也是比较方便的。
#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;}