您的位置首页生活百科

C语言枚举法解决问题

C语言枚举法解决问题

的有关信息介绍如下:

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;

}

输入 输出

输出