石油大 HD阶乘 求阶乘末尾0的个数
题目描述
n的阶乘定义为n! = n ∗ (n − 1) ∗ (n − 2) ∗ … ∗ 1。
n的双阶乘定义为n!! = n ∗ (n − 2) ∗ (n − 4) ∗ … ∗ 2或n!! = n∗ (n − 2) ∗ (n − 4) ∗ … ∗ 1,取决于n的奇偶性。
但是阶乘的增长速度太快了,所以我们现在只想知道n!和n!!末尾的0的个数。
输入
一个正整数n, n ≤ 107
输出
两个整数, 分别为n!和n!!末尾0的个数。
想法
阶乘太大了, 直接模拟复杂度太高, 百度一下发现有个规律, 记录一下
要判断末尾有几个0, 就是看这个数能整除几次10. 而能整除10,说明有因子5和2
阶乘过程中, 出现5的倍数之前一定会出现2的倍数(说明有了一个10), 反之,则不然
所以题目转化成了求阶乘过程中, 有几个因子5
双阶乘只是换了种形式, 本质不变
实现
#include <cstdio>
#include <iostream>
using namespace std;
int n, cnt1, cnt2;
void solve1(int n)
{
while(n >= 1)
{
cnt1 += n/5;
n /= 5;
}
}
void solve2(int n)
{
if(n&1) return;
cnt2 += n/10;
n /= 10;
while(n >= 2)
{
cnt2 += n/5;
n /= 5;
}
}
int main()
{
cin >> n;
solve1(n);
solve2(n);
cout << cnt1 << " " << cnt2 << endl;
return 0;
}