题目大意:
就是给定一个数要你求出n!的位数
Sample Input
2 10 20
Sample Output
7 19这道题目一开始我想算出n!但是是不行的,这里的n可以有好大范围<=7000可以将n!表示成10的次幂,即n!=10^M(10的M次方,10^2是3位M+1就代表位数)则不小于M的最小整数就是 n!的位数,对该式两边取对数,有M=log10^n!即: M = log10^1+log10^2+log10^3...+log10^n 循环求和,就能算得M值,该M是n!的精确位数。source code:968ms#include<iostream> #include<cmath> using namespace std; int main() { int i,t,n; double sum; cin>>t; while(t--) { sum=1; cin>>n; for(i=1;i<=n;i++) sum+=log10(i); printf("%d/n",(int)sum); } return 0; }
除此之外,我们还有更简单的办法,要用到斯特林公式n!~sqrt(2*pi*n)(n/e)^n 此为斯特林公式的简化公式(见下图)。 该公式常用来计算与阶乘有关的各种极限
source code:0ms#include<iostream> #include<cmath> const double PI=3.14159265; using namespace std; int main() { int t,n; double sum; cin>>t; while(t--) { cin>>n; sum=(n*log(n) - n + 0.5*log(2*n*PI))/log(10)+1; printf("%d/n",(int)sum); } return 0; }