试题历届真题乘积尾零【第九届】【省赛】【B组】(C++)

58 篇文章 0 订阅

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

如下的 1010 行数据,每行有 1010 个整数,请你求出它们的乘积的末尾有多少个零?

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 

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

PS:其实,所谓的0其实只有质因数存在2和5时才有零,那么题目的思路就是提取每个数的2因数与5因数的个数,个数小的就是零的个数

代码如下:

#include<iostream>
using namespace std;
int main()
{
	int two = 0, five = 0, n;
	for (int i = 0; i < 100; i++)
	{
		cin >> n;
		int t = n;
		while (1) {
			if (t % 2 == 0) {//取2的个数
				two++;
				t /= 2;
			}
			else {
				break;
			}
		}
		t = n;
		while (1) {
			if (t % 5 == 0) {//取2的个数
				five++;
				t /= 5;
			}
			else {
				break;
			}
		}
	}
	if (two > five) {
		cout << five;
	}
	else {
		cout << two;
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 好的,这是一道关于双向排序的省赛试题。题目描述如下: 给定一个长度为 $n$ 的正整数序列 $a_1,a_2,\cdots,a_n$,将它们分为两,设第一的元素为 $b_1,b_2,\cdots,b_m$,第二的元素为 $c_1,c_2,\cdots,c_{n-m}$,满足: - $b_1,b_2,\cdots,b_m$ 按照从大到小的顺序排列。 - $c_1,c_2,\cdots,c_{n-m}$ 按照从小到大的顺序排列。 - 对于所有 $1\le i<j\le m$,有 $b_i+b_j>a_k$,其中 $1\le k\le n-m$。 - 对于所有 $1\le i<j\le n-m$,有 $c_i+c_j<b_k$,其中 $1\le k\le m$。 现在给定 $n$ 和 $a_1,a_2,\cdots,a_n$,求符合条件的分方案数。 例如,当 $n=4$,$a_1=2,a_2=4,a_3=1,a_4=3$ 时,符合条件的分方案有 $3$ 种,分别为: - $b_1=4,b_2=2$,$c_1=1,c_2=3$; - $b_1=4,b_2=3$,$c_1=1,c_2=2$; - $b_1=3,b_2=2$,$c_1=1,c_2=4$。 请问这道题应该如何解答呢? ### 回答2: 第十二届省赛B的双向排序问题是一个典型的排序问题。 双向排序是指按照特定的规则对数据进行排序,既可以按照从小到大,也可以按照从大到小的顺序进行排列。这个问题可以使用排序算法来解决。 解决该问题的一种方法是使用冒泡排序算法。该算法的思想是通过多次遍历数,比较相邻的元素并交换位置,使得最大(或最小)的元素逐渐移到末尾(或开头),以此实现排序。 具体步骤如下: 1. 定义一个布尔变量flag来表示是否发生了元素交换的操作,默认为false。 2. 从数的第一个元素开始,依次比较相邻元素,如果前一个元素大于(或小于)后一个元素,则交换它们的位置,并将flag设为true,表示发生了交换。 3. 遍历完一次数后,如果flag仍为false,说明数已经是有序的,可以结束排序。 4. 如果flag为true,继续进行下一次遍历,从头开始重复上述步骤。 5. 重复步骤2-4,直到数完全排序。 在双向排序的问题中,需要使用两个冒泡排序。首先,按照从小到大的顺序对每一行进行排序,然后按照从大到小的顺序对每一列进行排序。这样一来,就可以实现双向排序。 总结起来,双向排序问题可以使用冒泡排序算法来解决。通过多次遍历数,分别按照行和列进行排序,即可达到双向排序的目的。 ### 回答3: 第十二届省赛B试题是关于双向排序的。双向排序是一种特殊的排序方法,既可以按照某一列的数值大小进行排序,又可以按照某一行的数值大小进行排序。 假设给定一个m行n列的矩阵,我们需要设计一个算法,使得矩阵按照以下规则进行排序: 1. 首先按照每一行的最小值进行排序,即每一行元素中最小的数排在前面; 2. 如果有两行及以上的最小值相同,则按照其所在行数从小到大进行排序; 3. 对于行数相同的元素,按照其所在列数从小到大进行排序。 我们可以采用以下步骤实现双向排序: 1. 遍历每一行,找到每一行的最小值,并将其与第一列的元素交换位置,保证每一行的最小值都在第一列; 2. 对矩阵按照第一列的数值大小进行排序,即将每一行的第一个元素作为关键字进行排序; 3. 对于第一列相同的元素,按照其所在行数从小到大进行排序,可以使用快速排序等算法实现; 4. 对于行数相同的元素,按照其所在列数从小到大进行排序,可以使用冒泡排序等算法实现。 通过以上步骤,我们可以得到按照双向排序规则排列的矩阵。这种排序方法可以保证每一行的最小值都在前面,同时满足其他排序规则。双向排序不仅简洁高效,还可以直观地展示矩阵中元素的分布情况,方便后续的数据分析和处理。 总结起来,双向排序是一种特殊的排序方法,可以按照每一行的最小值先排序,再按照行数和列数进行排序。它可以通过简单的交换和排序算法来实现,对于需要按照行和列进行排序的矩阵数据,是一种非常有用的排序方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白凤倚剑归

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值