[简单思维题]末尾零

题目描述

定义阶乘:n!=1*2*…*n
给定n,求n!末尾的0的个数。
例如:当n=10,n!=3628800,末尾0的个数为2。

输入

输入共一行,一个正整数n(n<=10^9)。

输出

输出共一行,包含一个整数,表示对应答案。

样例输入

15

样例输出

3

思路:n!可以写成质因数分解的形式即n!=(2^x)*(3^y)*(5^z)...,显然这里面的一个2与一个5相乘能使末尾产生一个0,那么末尾0的个数就是min(x,z),
由于在1~n中能被2整除的数多于能被5整除的数,则x>z,即min(x,z)=z,那我们就只需要计算n!的因子5的个数即可。
因子5的个数有两种算法:1.计算从1到n的每一个数里有多少个5,求和
2.带入公式(n/5)+(n/25)+...+(n/[5^k])([5^k]<=n)即可得因子5得个数(n/5表示1~n里是5的倍数的数有几个,n/25表示1~n里是25的倍数的数有几个,以此类推)

AC代码:
#include <iostream>
#include<cstdio>
using namespace std;

int main()
{
    int n;
    scanf("%d",&n);
    int k=5;
    int ans=0;
    while(k<=n){//利用上述公式
        ans+=n/k;
        k*=5;
    }
    printf("%d
",ans);
    return 0;
}
 
转载请注明出处:https://www.cnblogs.com/lllxq/
原文地址:https://www.cnblogs.com/lllxq/p/8660524.html