蓝桥--乘积尾零

题目:如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?
5650 4542 3554 473 946 4114 3871 9073 90 4329
2758 7949 6113 5659 5245 7432 3051 4434 6704 3594
9937 1173 6866 3397 4759 7557 3070 2287 1453 9899
1486 5722 3135 1170 4014 5510 5120 729 2880 9019
2049 698 4582 4346 4427 646 9742 7340 1230 7683
5693 7015 6887 7381 4172 4341 2909 2027 7355 5649
6701 6645 1671 5978 2704 9926 295 3125 3878 6785
2066 4247 4800 1578 6652 4616 1113 6205 3264 2915
3966 5291 2904 1285 2193 1428 2265 8730 9436 7074
689 5510 8243 6114 337 4096 8199 7313 3685 211

问题分析:看到这个题,我们首先第一个想法就知道把这一百个数相乘在计算尾零是不现实的,所以我们从整数的基本性质上入手,什么样的数相乘会得到尾零的数呢,一种是自带尾零的和任何整数相乘数尾都会有0,还有一种就是各位数为偶数的数和各位为5的数相乘会得到尾零的数,所以解题思路就是:

  • 首先用一个数组装下这100个数,然后用一个循环依次对这些数按照上面两种情况进行进行比对
  • 循环体内分为三部分,分别是判断能否被10,5,2整除
  • ***细节来啦,如果我们判断这个数能够被这三个数整除,我们要对它做相应的处理,以免被重复计算
#include<iostream>
using namespace std;

int main() {
	int m = 0, n = 0, k = 0;
	int a[100]={
	5650,4542,3554,473,946,4114,3871,9073,90,4329 ,
	2758,7949,6113,5659,5245,7432,3051,4434,6704,3594,
	9937,1173,6866,3397,4759,7557,3070,2287,1453,9899,
	1486,5722,3135,1170,4014,5510,5120,729,2880,9019,
	2049,698,4582,4346,4427,646,9742,7340,1230,7683,
	5693,7015,6887,7381,4172,4341,2909,2027,7355,5649,
	6701,6645,1671,5978,2704,9926,295,3125,3878,6785,
	2066,4247,4800,1578,6652,4616,1113,6205,3264,2915,
	3966,5291,2904,1285,2193,1428,2265,8730,9436,7074,
	689,5510,8243,6114,337,4096,8199,7313,3685,211
	};
	for (int i = 0; i < 100; i++)  {
		while (a[i] % 10 == 0) {   
			m++;
			a[i] /= 10;
		}
		while (a[i] % 5 == 0) {
			n++;
			a[i] /= 5;
		}
		while (a[i] % 2 == 0)
		{
			k++;
		a[i]/= 2;
		}
	}
	cout << m + (n>k?k:n) << endl;
	return 0;
}

注意三个判断语句使用的是while,而不是if,当我们判定一个数可以被这三个数整除后,需要循环除以这个数,以免在接下来的判断中被重复计算,例如4800,如果我们使用的是if语句来判断,那么它会进行一次除以10 操作后向后继续运行,但是480可以重复被5和2再除,影响计算结果

注意每个自带尾零的数可以直接在最终结果增加一个零,而2和5结尾的则需要排队才能使最后结果增加一个0,而且谁的个数少谁决定。

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值