蓝桥杯-乘积尾0

问题描述

给定一些正整数,每个数字都不会超过10000,请计算给定的所有数字连乘后的结果的末尾有多少个0;

测试用例1

12 50 12 50 12 5012 50 12 50

测试用例2

100 150 340 518 420130 5886 876 380 225

测试用例3
5650 4542 3554 473 946 4114 3871 9073 904329 
2758 7949 6113 5659 5245 7432 3051 4434 67043594 
9937 1173 6866 3397 4759 7557 3070 2287 14539899 
1486 5722 3135 1170 4014 5510 5120 729 28809019 
2049 698 4582 4346 4427 646 9742 7340 12307683 
5693 7015 6887 7381 4172 4341 2909 2027 73555649 
6701 6645 1671 5978 2704 9926 295 3125 38786785 
2066 4247 4800 1578 6652 4616 1113 6205 32642915 
3966 5291 2904 1285 2193 1428 2265 8730 94367074 
689 5510 8243 6114 337 4096 8199 7313 3685211 

算法思路

这个问题的关键是了解到0是怎么来的,其实很巧妙的可以发现一个规律:

比如44*5=220,这个式子可以写成11*2*2*5=11*2*(2*5)=22*10=220;

比如56*25=7*2**2*2*5*5=7*2*(2*5)*(2*5)=7*2*10*10=1400;

可以看出来乘积末尾0的个数就是把式子化为以上形式,找出有多少对2*5,就是有多少个0。

代码实现

#include <iostream>
#include <string>
using namespace std;
int main()
{
int num;    //记录输入的数字;
int m = 0;  //记录2的个数;
int n = 0;  //记录5的个数;
for (int i = 0; i < 100; i++)
{
cin >> num;
while (num % 2==0)
{
m++;
num /= 2;
}
while (num % 5 == 0)
{
n++;
num /= 5;
}
}
cout << (m < n ? m : n);  //输出m和n的较小值(三目运算符的用法自行百度);
return 0;
}

猜你喜欢

转载自blog.csdn.net/kiss__soul/article/details/80184455
今日推荐