该题很明显我们绝对不能暴力求解,这里分享一下我做这道题的过程
一开始,我认为要想知道乘积末尾有多少0 ,我们可以通过每个数字num的末尾0的个数以及乘积后的数字sum末尾0的个数 来得知 ,所以我就决定边判断边 /=10 ,所以我这样写
#include<iostream>
using namespace std;
int main()
{
unsigned long long sum = 1;
int num,cn=0;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
cin >> num;
while ((num % 10) == 0)
{
num /= 10;
cn++;
}
sum *= num;
while ((sum % 10) == 0)
{
sum /= 10;
cn++;
}
}
}
cout << cn << endl;//38
return 0;
}
然后我很自信地将“答案”38输入OJ,OJ给出答案错误(估计还是数字太大了吧)
最后不得已还是换了思路
对于这道题,我们其实肯定不能去 乘 ,而是要通过每一个数字来得到答案
对于每一个数字,我们其实可以拆,我们观察可知如果两个数字相乘能够出现0,那么这两个数字一定能够被拆解出 2 和 5(1到9之间的数字,只有2*5能够得到0)
所以我们只需遍历每个数字看看所有的数字能够拆出多少个2和5
最后输出较小的那个数字即可
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
unsigned long long sum = 1;
int n,cn_2=0,cn_5=0;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
cin >> n;
while ((n % 2) == 0)
{
cn_2++;
n /= 2;
}
while ((n % 5) == 0)
{
cn_5++;
n /= 5;
}
}
}
cout << min(cn_2, cn_5) << endl;
return 0;
}