穷举法——练习
穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。
下面是部分穷举法的练习题目:
第1题:
打出所有的水仙花数(水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身)
只需要对所有三位数遍历,寻找符合要求的值即可。
代码如下:
#include<stdio.h>
#include<math.h>
//打出所有的水仙花数
void Shuixianhuashu()
{
int i;
for (i = 99; i < 1000; i++)//水仙花数为三位数,从100开始遍历,直到999.
{
if (pow(i / 100, 3) + pow(((i % 100) / 10), 3) + pow(i % 10, 3) == i)
{
printf("%d\n", i);
}
}
}
int main()
{
Shuixianhuashu();
return 0;
}
输出结果如下:
第2题:
百马百担问题:有一百匹马,驮一百担货,大马驮3担,中马驮2担,两只小马驮一担,问有多少种方法,大中小马各几匹。
简单分析:
先考虑大马的数量,从0开始,直到100,每次确定大马数量后,继续从0开始遍历中马的数量,然后确定小马数量,找到符合条件的情况。
代码如下:
#include<stdio.h>
#include<math.h>
void H_house()
{
int i, j, k;//i,j,k分别用来存放大,中,小,马的数量。
int n=0;//用来存放方法数
for (i = 0; i <= 100; i++)//大马从0开始遍历
{
if (i * 3 <= 100)
{
for (j = 0; j <= 100; j++)//在确定大马数量后,中马遍历
{
if (i * 3 + j * 2 <= 100)
{
k = (100 - i * 3 - j * 2) * 2;//计算小马数量
if (i + j + k == 100)
{
n++;
printf("大马%d匹,中马%d匹,小马%d匹\n", i, j, k);
}
}
else
{
break;
}
}
}
else
{
break;
}
}
printf("共有%d种方法\n", n);
}
int main()
{
H_house();
return 0;
}
输出结果如下:
第3题:
古代数学问题:1兔换2鸡,2兔换3鸭,5兔换7鹅。某人用20只兔子换得鸡,鸭,鹅共30只,问其中鸡、鸭、鹅各几只。
简单分析:
和第二题一样,先考虑鸡的数量,再考虑鸭的数量,最后得到鹅的数量,加上限制条件即可,但要注意,鸡每次增加两只,鸭每次增加3只。
代码如下:
#include<stdio.h>
#include<math.h>
void Num()
{
int i, j, k;//分别用来存储鸡、鸭、鹅的数量;
for (i = 0;i <= 30; i+=2)//鸡的数量,从0开始,每次加2只
{
for (j = 0;j <= 30; j+=3)//鸭的数量,从0开始,每次加3只
{
k = 0;
k += 7;//鹅的数量,同上
if (i / 2 + ((2 * j) / 3) + ((5 * k) / 7) == 20 && j + i + k == 30 && k >= 0)//加上限制条件,输出符合条件的数据
{
printf("共换得鸡%d只,鸭%d只,鹅%d只\n", i, j, k);
}
}
}
}
int main()
{
Num();
return 0;
}
输出结果如下: