方法一:
我们知道,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;
题目链接:
题目描述
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;
}