求给定N的阶乘末尾存在多少个0。
基本思路:能产生0的,有10*1,2*5...,归根结底,是2,5两个因数产生0;因为因数里面2的个数一定大于5的个数,因此只需计算5的个数即可。
一般规律:将N循环除以5,直至N<0,并将每次除5所得的商相加即是0的个数。
#include <iostream>
using namespace std;
int n;
void dI(int x)
{
int t = 0;
while (x > 0) {
t += x/5;
x /= 5;
}
cout << t << endl;
}
int main()
{
while (cin >> n)
{
dI(n);
}
return 0;
}
反过来:满足N!的末尾恰好有K个0的最小的N是多少? 如下题:
[蓝桥杯2022初赛] 求阶乘
逆向思维,枚举结果,利用二分法,直至寻找到合适的答案。
#include <iostream>
using namespace std;
typedef long long ll;
ll k;
ll n;
ll Math(ll t) //求t的阶乘有几个0
{
ll zero = 0;
while (t > 0)
{
zero += t / 5;
t /= 5;
}
return zero;
}
int main()
{
cin >> k;
ll left = 1, right = 6000000000000000005;
while (left < right)
{
ll mid = (left + right) / 2;
if (Math(mid) >= k) {
right = mid;
}
else
left = mid + 1;
}
if (Math(left) == k)
cout << left;
else cout << -1;
return 0;
}