蓝桥杯-枚举

在这里插入图片描述

🎈1.算法说明

枚举就是根据提出的问题,一一列出该问题的所有可能的解,并在逐一列出的过程中,检验每个可能解是否是问题真正解,如果是就采纳这个解,如果不是就继续判断下一个。
枚举法一般比较直观,容易理解,但由于要检查所有的可能解,因此运行效率较低。

🔎能够用枚举法解决的题目往往是最简单的一类题目。这种题目具有以下特点:

  • 解枚举范围是有穷的。
  • 检验条件是确定的。

🏆枚举法的结构:枚举范围循环+条件判断语句。

🎈2.例题说明

🔭2.1例题一

🔎问题:李华说:“我的年龄是个两位数,我比儿子大27岁,如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄。”请你计算李华的年龄有多少可能情况?

📝思路:根据题目的描述,我们知道李华的年龄是两位数,因此范围应当在【10-99】之间。同时检验条件也是非常确定的,我们只需要将枚举的年龄的个位和十位交换,如果发现比原数字刚好小27,那么它就是真正的解。

📖算法

#include <iostream>
using namespace std;
int main()
{
	int count = 0, i = 0;
	for (i = 10; i <= 99; i++)
	{
		if (i - (i % 10 * 10 + i / 10) == 27)
			count++;
	}
	cout << count << endl;
	return 0;
}

在这里插入图片描述

🔭2.2例题二

🔎问题:如果一个三位数,它的每一位上的数字的三次幂之和等于它本身,那么我们就称这个数字为有一个水仙花数,现在我们要求出所有的水仙花数。

📝思路:根据题目的描述,我们知道要求的水仙花为三位数,因此范围应当在【100-999】之间。同时检验条件也是非常确定的,我们只需要将该三位数的每一位的数的三次幂求和与自身比较,相等即为水仙花数。

📖算法

#include <iostream>
using namespace std;
int main()
{
	int a, b, c, i = 0;
	for (i = 100; i <= 999; i++)
	{
		a = i / 100;//百位
		b = i % 100 / 10;//十位
		c = i % 10;//个位
		if (a * a * a + b * b * b + c * c * c == i)
			cout << i << " ";
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

🔭2.3例题三

🔎问题:12321,123321都有一个共同的特征,就是无论从左到右还是从右到左读,都是相同的。这样的数字叫做回文数,现在需要找出五位或六位数的各个位数和等于n的回文数。

📝思路:根据题目的描述,我们知道要求的回文数为五位数和六位数,因此范围应当在【10000-999999】之间。同时检验条件也是非常确定的,我们只需要将该数的正过来和反过来读是否相等,相等即为回文数数。接着还得判断这些回文数中,哪些的各个位数之和为n,即为我们要求的回文数。

📖算法

#include <iostream>
using namespace std;
int n;
int digit[6];
bool judge(int x)
{
	int m = 0, sum = 0;
	while (x)
	{
		digit[m++] = x % 10;
		sum += x % 10;
		x /= 10;
	}
	if (sum != n)
		return false;
	for (int i = 0; i < m/2; i++)
	{
		if (digit[i] != digit[m - 1 - i])
		{
			return false;
		}
	}
	return true;
}
int main()
{
	bool f = false;
	cin >> n;
	int i = 0;
	for (i = 699996; i <= 999999; i++)
	{
		if (judge(i))
		{
			cout << i << " ";
			f = true;
		}
	}
	cout << endl;
	if (!f)
		cout << -1 << endl;
	return 0;
}

在这里插入图片描述

🔭2.4例题四

🔎问题:小明从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。现在算起来,他一共吹熄了236根蜡烛。那么,他从几岁开始过生日party的。从常识来讲,一个人的年龄不可能超过两百岁。

📝思路:根据题目的描述,我们知道小明的年龄范围应当在【0-200】之间。但是循环的次数并不确定。

#include <iostream>
using namespace std;
int main()
{
	for (int i = 1; i <= 200; i++)
	{
		int can = 0, j = i;
		while (can < 236 && j <= 200)
		{
			can += j;
			j++;
		}
		if (can == 236)
			cout << i << endl;
	}
	return 0;
}

在这里插入图片描述

🔭2.5例题五

🔎问题:两种糖果分别有9个和16个,要全部分给7个小朋友,每个小朋友得到的糖果总数最小为2个,最多为5个,问有多少种不同的分法。糖果必须全部分完。

📝思路:根据题目的描述,我们知道糖果一共有25个(9+16),小朋友7个,每人最小2个,最多5个。

#include <iostream>
using namespace std;
int ftg(int kind, int sweet1, int sweet2, int min, int max)
{
	int total = sweet1 + sweet2;
	int num = 0;
	int i = 0, j = 0;
	if (kind == 1)
	{
		if (total >= min && total <= max)
			return 1;
		else
			return 0;
	}
	else if (total < min * kind)
		return 0;
	else
	{
		for (i = min; i <= max; i++)
		{
			for (j = 0; j <= i; j++)
			{
				if (sweet1 - j >= 0 && sweet2 - (i - j) >= 0)
				{
					num += ftg(kind - 1, sweet1 - j, sweet2 - (i - j), min, max);
				}
			}
		}
	}
	return num;
}
int main()
{
	int num = ftg(7, 9, 16, 2, 5);
	cout << num << endl;
	return 0;
}

在这里插入图片描述

好啦,关于枚举的知识到这里就先结束啦,后期会继续更新学习蓝桥杯的相关知识,欢迎大家持续关注、点赞和评论!❤️❤️❤️

  • 30
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一口⁵个团子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值