当前位置: 代码迷 >> 综合 >> 问题 A: 【div3】Multiplication
  详细解决方案

问题 A: 【div3】Multiplication

热度:67   发布时间:2023-11-22 08:08:05.0

每日一题 7-13

题目:
Multiplication
题目描述
LYcandl 今天学习了乘法运算,在计算了几个数的乘积之后,她发现许多数的乘积末尾都是一串连续的 0,所以她想让你帮她计算一些数的乘积结尾有多少个连续的 0。
输入
第一行一个整数 n,表示 LYcandl 想让你帮忙计算相乘的数的个数。
接下来一行包括 n 个整数a1、a2、··· 、an。
输出
输出 n 个数的乘积末尾有多少个 0 。
【输入样例1】
4
2 3 5 7
【输入样例2】
6
2 2 5 10 12 25
【输出样例1】
1
【输出样例2】
4
【提示】
对于 40%的数据:1≤n≤200;1≤ai≤200。
对于 70%的数据:1≤T≤10000;1≤ai≤1,0000。
对于 100%的数据:1≤T≤100000;1≤ai≤10^18。

第一组样例中 2357 = 210 ,所以末尾有1个0
第二组样例中 2
25101225 = 60000 ,所以末尾有4个0

我的思路

这道题很容易读懂,就是简单的求乘积,之后求乘积末尾有几个连续的0

但是看过提示之后的内容之后发现,这道题麻烦在数据溢出上,数据分布在long long范围内,因此,求积的方法不是超时,就是这个数组其中两个数相乘就已经爆long long了。

所以,我们尽量不要从乘积上下手,而是直接从输入的每个数下手,(2*5=10)找出这个数组中所有的数分别是2和5多少个整数倍,之后在这两个数之间取小,就得出结果。

我的代码

//created by LMY
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
{
    ll n, i, num2 = 0, num5 = 0;ll a[100005]={
    0};cin >> n;for (i = 0; i < n; i++){
    cin >> a[i];if (a[i] % 2 == 0){
    while (a[i] % 2 == 0){
    a[i] = a[i] / 2;num2++;}}if (a[i] % 5 == 0){
    while (a[i] % 5 == 0){
    a[i] = a[i] / 5;num5++;}}}cout << min(num2, num5) << "\n";return 0;
}