0
点赞
收藏
分享

微信扫一扫

蓝桥杯 2018届省赛B组真题 乘积尾零

霍华德 2022-03-11 阅读 59
蓝桥杯c++

该题很明显我们绝对不能暴力求解,这里分享一下我做这道题的过程

一开始,我认为要想知道乘积末尾有多少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;
}
举报

相关推荐

0 条评论