两数相乘0的个数

介绍

我们计算两个数相乘0的个数的时候,可以直接简单粗暴的乘出来再看,但是如果数非常多,而且数又非常大的时候怎么办呢?到时候肯定不能粗暴的做了。

我们可以找每个数的2的因子个数和5的因子个数。看看有多少对因子2和因子5。
例如下面这个题。

题目例子

Snipaste_2023-02-17_11-37-07.png

讲解

我们不用直接计算两个数相乘,我们看所有的数中因子2和因子5的个数,有一对2和5,就会有一个0。最后算出来2和5不一定能凑对,可能会有一个数多,那么我们就取2和5中个数最少的那个就行了。

发散

我们看一个数有多少个0,我们可以看这个数包含多少对2和5。
因为这个数可以写成两个数相乘的形式,所以我们看这两个乘数有多少对2和5就行了。

源代码

#include <bits/stdc++.h>

using namespace std;

#define LL long long

#define endl "\n"

const int N = 110;

int a[N];

void read()
{
    for (int i = 0; i < 100; i ++ ) cin >> a[i];
}

int val_2(int x)
{
    int cnt = 0;
    while(x % 2 == 0)
    {
        cnt ++;
        x /= 2;
    }
    return cnt;
}

int val_5(int x)
{
    int cnt = 0;
    while(x % 5 == 0)
    {
        cnt ++;
        x /= 5;
    }
    return cnt;
}

void solve()
{
    int num_2 = 0, num_5 = 0;
    for (int i= 0; i < 100; i ++ )
    {
        num_2 += val_2(a[i]);
        num_5 += val_5(a[i]);
    }

    int res = min(num_2, num_5);

    cout << res << endl;

}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    read();
    solve();

    return 0;
}
THE END