51nod1003阶乘后边0的数量

题目描述  链接戳这里

解法:

《编程之美》书里有讲

N!能产生0的质数组合只能是2 * 5,也就是说当对N!进行质数分解之后

N!末尾 0 的个数取决于从 1 到 n 的各个数的因子中 2 和 5 的个数的较小的那个,但又因为能被2整除的数出现的频率比能被5整除的数高得多,且出现一个5的时,最少会同时出现一个2,所以最小值就是5出现的个数。即求出5出现的个数就可以得到N!末尾0的个数。

求5出现的个数 

n的阶乘 就是 1x2x3x4x5x6........xn  

各个因子中5的个数 就是  n累除以5  得到的数字累加  直到 得到0

比如  25 = 1x2x3x4x5x6......x25  这里面每个数进行质因数分解 会得到6个五,其中5,10,15,20各自有一个  25有两个

25/5 =5   5/5=1  1/5=0    5+1+0=6;

为什么 这样解呢   因为  分解质因数后  5,10,15,20各自贡献一个  25贡献两个  125 贡献三个  以此类推

所以  这里面出现的5的次数 就是  =【n/5】+【n/25】+【n/125】......

扫描二维码关注公众号,回复: 4312887 查看本文章

所以就是n累除5 计数就好了

代码

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
const int maxn=1e5+7;
typedef long long ll;
ll n;
int main(){
    scanf("%lld",&n);
    ll sum=0;
    while(n){
        sum+=n/5;
        n/=5;
    }
    printf("%lld",sum);
    return 0;
}

 

猜你喜欢

转载自blog.csdn.net/holly_Z_P_F/article/details/83930934