一 给定一个数要你求出n!的位数HDU 1018) //常规算法,能过,但慢一些 //主要思想就是 n!=10^m; 这样只要求出m再向下取整加1就可以了 // 上面等式两边去log10,然后 m=log10(1)+log10(2)+~~~~~~~+log10(n) // // #include #include #include using namespace std; int main() { int T; scanf("%d",&T); int n,i; while(T--) { scanf("%d",&n); double ans=1.0; for(i=1;i<=n;++i) ans+=log10((double)i); printf("%d\n",(int)ans); } return 0; } //斯特林公式法, 特别快。 const double pi=3.14159265; double ans=(n*log((double)n)-n+0.5*log((double)2*n*pi))/log(10.0); printf("%d\n",(int)ans+1); 二 求n!后面有多少个零 DUT OJ 1184 // 这道题的思想 就是找出n! 中能有多少个5,因为10只能由5的偶数倍得到,即便有 //10,也要分成两个5; 偶数是足够多的。对n 一直除以5,每次除得的余数加,直到0 #include int main() { int T; scanf("%d",&T); int n; while(T--) { scanf("%d",&n); int counter=0; while(n) { counter+=n/5; n/=5; } printf("%d\n",counter); } return 0; } 本文来源:https://www.wddqw.com/doc/badc3aa06629647d27284b73f242336c1fb93053.html