C语言枚举法解决问题
的有关信息介绍如下:枚举法是一种比较“笨”的算法思想,在面对问题时它会尝试每一种情况。打一个比方,假设有两个小朋友A和B在玩做迷藏的游戏,规定只能藏在树上、屋顶上和墙角。A比较聪明,他在找到之前会先考虑B恐高,所以他推测B只能藏在角落处;而B比较笨,他不会考虑A会不会爬树,它会随便找一个地方,如果发现这个地方没有,他会去寻找另外一个地方。如果可以藏的地方有多个,B会挨个地方寻找,直到找到A为止。上述B挨个地方寻找的做法就和枚举法算法思想的原理一样。
枚举算法的思想:将问题的所有可能答案一一列举,然后根据条件判断此答案是否符合条件,保留合适的,丢弃不合适的。使用枚举法算法解题的基本思路如下所示。
确定枚举对象、枚举范围和判定条件。
逐一枚举可能的解,验证每个解是否是问题的解。
题解的可能范围不能遗漏任何一个真正解,也要避免有重复。
判断是否是真正解的方法。
试可能解得范围降至最小,以便提高解决问题的效率。
使用枚举法解决“填写运算符”的问题
在下面的算式中,添加“+”、“-”、“x”、“÷“4个运算符,使这个等式成立。5 5 5 5 5=5
上述算式由5个数字构成,一共需要填入4个运算符。根据题目要求,知道每两个数字之间的运算符只能有4种选择,分别是“+”“-”“x”“÷”。在具体编程时,可以通过循环来填入各种运算符,然后在判断算式是否成立。并且保证当填入除号时,其右侧的数不能是0,并且“x”“÷”运算符的优先级高于“+”、“-”。
#include
int main()
{
int j; //设置循环变量
int i; //表示4个运算符
int num; // 表示输入的5个数据
int result; // 表示最终验证的结果值
int sign; // 加减运算时的符号
int count=0; // 统计一共有多少种符合的式子
float left,right; // left表示左边的值,也就是算加减法时的值,right表示右边的值,也就是运算时下一个数的值
char oper={' ','+','-','*','/'}; //表示运算符
printf("请输入5个数的值\n");
for(j=1;j<=5;j++)
scanf("%d",&num[j]);
printf("请输入结果值是\n");
scanf("%d",&result);
for(i=1 ; i<=4 ; i++) //循环4种运算符,i=1时,由下面的oper[i]可知表示+号,因此,在这里面,1表示+,2表示-,3表示*,4表示/
{
if( (i<4) || (num!=0) ) //运算符等于4时,也就是为除号时,它后面的数不能为零;如果后面的为零,则前面的运算符不能为除号
{
for(i=1;i<=4;i++)
{
if((i<4) || (num!=0))
{
for(i=1;i<=4;i++)
{
if((i<4) || num!=0)
{
for(i=1;i<=4;i++)
{
if((i<4)||num!=0)
{
left=0; //设置最开始的数值为0
right=num; //设置右边的数,也就是下一个数是多少,这里设置为5个中数的第一个数
sign=1; //运算时符号初始化为正值,用1来表示
for(j=1;j<=4;j++)
{
switch(oper[i[j]]) //判断运算符
{
case '+':
left=left+sign*right; //加减法时的值
right=num[j+1]; //下一个数的值
sign=1;
break;
case '-':
left=left+sign*right;
right=num[j+1];
sign=-1; //实现减法
break;
case '*':
right=right*num[j+1]; //实现乘法,优先级为*高于+-,所以先算右边的数
break;
case '/':
right=right/num[j+1]; //实现除法
break;
}
}
if(left+sign*right==result) //将左边的数和右边的数相加就是最终值,看与验证值是否相等
{
count++;
printf(" 第%d个成立的等式: ",count);
for(j=1;j<=4;j++)
printf("%d%c",num[j],oper[i[j]]); //输出这些数和运算符
printf("%d=%d\n",num,result); //输出第5个数和验证值
//此部分输出符合条件的完整表达式
}
}
}
}
}
}
}
}
}
if(count==0) //说明没有符合的,count不变,输出无
printf("没有符合的等式!!!\n");
return 0;
}
输入 输出
输出