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