阶乘位数问题,用传统的递归或者暴力不可能提交,然后上网查了查,长了姿势!
解法一:
M = log10^1+log10^2+log10^3...+log10^n
循环求和,就能算得M值,该M是n!的精确位数。
#include<stdio.h> #include<math.h> int main() { int t,n; int i; double num; scanf("%d",&t); while(t--) { scanf("%d",&n); num=1; for(i=1;i<=n;i++) num+=log10(i); printf("%d\n",(int)num); } return 0; }解法二:
利用斯特林公式。
斯特林公式用于求解阶乘近似值,在阶乘过于庞大时,多利用。
n!~sqrt(2*pi*n)(n/e)^n
对其进行整理
len=(int)ceil((N*log(N)-N+log(2*N*PI)/2)/log(10));ceil求上界,即不小于某值的最小整数