问题描述
给定一些正整数,每个数字都不会超过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;
}