石油大 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;
}
posted @ 2020-12-02 22:43  a-shy-coder  阅读(67)  评论(0编辑  收藏  举报