51Nod 1003 阶乘后面0的数量

来源:互联网 发布:初中化学软件有哪些 编辑:程序博客网 时间:2024/05/21 20:28

方法一:

我们知道,10 = 2 * 5。每一个 2 与一个 5 相乘,结果就增加一个零。所以求 n!
后面的连续零的个数,其实就是求其中相乘的数含因子对 2 与 5 的个数。又因为从1到某个数,所含 2 的个数比 5 多,所以问题就可以进一步简化到求含有因子5的个数。

伪代码:

//o(nlogn)超时int n, ans = 0; cin>>n;for(int i = 5; i <= n; i+=5){       int t = i;    while(t%5 == 0) t/=5, ++ans;        }cout<<ans<<endl;

方法二:

求阶乘结果后面0的个数:

1~9 中  2*5 会出现0
所以只要有一个5就会出现一个0,因为5一定比2出现的晚.
其次有一个25(5^2)出现,也会出现一个0,
有一个125(5^3)出现,也会出现一个0.
……………………………………………………
………….. (5^k)...,,,....0

伪代码:

//o(logn)int n, ans = 0;cin>>n;while(n >= 5){    n /= 5;    ans += n;}cout<<ans<<endl;

题目链接:

51Nod 1003 阶乘后面0的数量

题目描述

n的阶乘后面有多少个0?
6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0。

Input

一个数N(1 <= N <= 10^9)

Output

输出0的数量

#include<iostream>using namespace std; int main(){    int n;    cin>>n;    int ans = 0;    while(n >= 5)    {        n /= 5;        ans += n;    }    cout<<ans<<endl;    return 0;}
0 0
原创粉丝点击