蓝桥杯第九届c++b组省赛3

本文介绍了一种计算多组整数乘积后尾零数量的方法,通过分解因数找出2和5的数量,最终输出两者中较小者作为结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标题:乘积尾零

如下的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实际上是2*5,所以就都拆成2和5,然后输出两个的最小值就行

#include <stdio.h>
int b2=0,b5=0;
void hs(int x)
{
	while(x!=0)
	{
		int f1=0,f2=0;
		if(x%2==0)
		{
			f1=1;
			b2++;
			x/=2;
		}
		if(x%5==0)
		{
			f2=1;
			b5++;
			x/=5;
		}
		if(f1==0&&f2==0) break;
	}
}
int main()
{
	int a[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};
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<10;j++)
		{
			hs(a[i][j]);
		}
	}
	printf("%d\n",b2>b5?b5:b2);
	return 0;
}
### 第十四届蓝桥杯 B C++ 题解及相关经验 #### 关于第十四届蓝桥杯 B的题目解析 针对第十四届蓝桥杯 B C++ 的题目解析,可以从以下几个方面入手。首先,在准备阶段,熟悉基础算法和简单的数据结构是非常重要的[^1]。例如,常见的排序算法(快速排序、归并排序)、搜索算法(深度优先搜索 DFS 和广度优先搜索 BFS),以及动态规划的基础概念都是必备的知识点。 以下是部分可能涉及的经典题型及其解决思路: 1. **字符串处理** 字符串操作是编程比中非常常见的一类问题。可以参考 `to_string()` 函数的应用场景来理解如何将不同类型的数据转换为字符串形式[^3]。例如: ```cpp #include <iostream> #include <string> using namespace std; int main() { string str = to_string(123); cout << "Integer to String: " << str << endl; double d = 12.3456789; str = to_string(d); cout << "Double to String (with precision): " << str.substr(0, 8) << endl; char ch = &#39;A&#39;; str = to_string((int)ch); // 将字符转为其 ASCII 值对应的字符串 cout << "Char to Int/String: " << str << endl; return 0; } ``` 2. **数与双指针技巧** 双指针是一种高效的解决问题方法,尤其适用于两数之和或者寻找子序列等问题。需要注意的是,在实现过程中应避免直接修改原数内容,而应该通过其他变量记录状态变化[^4]。下面是一个经典的例子: ```cpp #include <vector> #include <iostream> using namespace std; vector<int> twoSum(vector<int>& nums, int target) { int i = 0, j = nums.size() - 1; while(i < j){ if(nums[i] + nums[j] == target){ return {i+1,j+1}; // 返回索引加一的结果 }else if(nums[i]+nums[j]<target){ ++i; }else{ --j; } } return {}; } int main(){ vector<int> v{2,7,11,15}; auto res=twoSum(v,9); for(auto &num :res)cout<<num<<" "; return 0; } ``` #### 备考建议与参经验分享 为了更好地应对蓝桥杯,以下几点备考经验和策略可能会有所帮助: - 提前至少半年时间开始复习,并制定详细的计划表[^2]。 - 加强对 STL 容器的学习,比如 `vector`、`map`、`set` 等容器的操作方式。 - 力求做到每种基本算法都能手写出来并且清楚其复杂度分析。 - 利用力扣平台刷题提升实战能力,目标达到一定数量级以上的练习量。 #### 总结 综上所述,无论是从理论知识还是实践技能来看,充分准备加上不断积累的经验才是取得优异成绩的关键所在。希望上述内容能够对你有所启发!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值