【#文档大全网# 导语】以下是®文档大全网的小编为您整理的《关于 阶乘的若干定理》,欢迎阅读!
一 给定一个数要你求出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.wddqxz.cn/9ed7f3013269a45177232f60ddccda38376be1e2.html