填写运算符问题 暴力枚举

别来无恙 提交于 2020-03-16 20:09:45

题目

1.问题描述:在下面的算式中,添加“+”、“-”,“*”,“/,4个运算符,使得这个式子成立。
5  5  5  5  5=5
2,算法分析:
上述式子左侧有5个数字,一共需要4个运算符。根据题目要求,两个数字之间的运算符只能有4中选择。在
具体编程时,可以通过循环来填入各种运算符,然后再判断算式左侧的值是否等于右侧的值。并保证,当填入的
是除号时,则右侧的数不能为0,并且乘除的优先级高于加减的优先级。

————————————————————————————————————————

这道题使用的是暴力法,也就是枚举,让我们填入四个运算符,并且根据运算符的先后顺序进行运算求解最后的答案

第一步:要枚举出所有符合条件的运算符号,这里最主要的是/号,后面那个数字不得为0,筛选出运算符号的组合放入数组中,这里应当用数字来代替四个运算符号 1-4分别代表+ - * /

第二步:首先得话定义左和右两个值,这里注意的是应当设置浮点型,可能中途运算会有小数存在,避免像1/5得到结果为0,实际为0.2

左右两个值分别代表的是前一次的左右值,其中最巧妙的是进行判断当前运算符的时候,前面那次运算会在这次碰到的运算符的时候进行对应的操作
有三个数 x y z
例如:left,right分别保存着x,y,此时运算到y和z中间是 * 运算符,这时候会先进行y和z的运算,left并不动 ,此时left = x,right = x*y

若是y和z之间是加减运算符时,left = x±y right = z
left 和right起到了根据运算符分别进行不同的操作

第三步:四次运算符都结束时,还是会有剩余的left和right左右两部分,所以 额外还要将left和right运算一次,最后在进行判断是否等于要求的值,并且打印出来
题解

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
	int i[5],num[6];  //每个坐标下范围为1-4,1->+  2->-  3->* 4->/ 
	char op[6] = {' ','+','-','*','/'};  //这里存放的+-*/   从下标1开始 
	int count=0,result;
	
	printf("请输入5个带空格的数:");
	for(int j=1;j<=5;j++)
		scanf("%d",&num[j]);
	printf("输入结果:");
	scanf("%d",&result);   //结果 
	
	for(i[1]=1;i[1]<=4;i[1]++){    //四种情况 
		if(i[1]<4||num[2]!=0){
			
		for(i[2]=1;i[2]<=4;i[2]++){
				if(i[2]<4||num[3]!=0)
				
				for(i[3]=1;i[3]<=4;i[3]++){
					if(i[3]<4||num[4]!=0)
					
					for(i[4]=1;i[4]<=4;i[4]++){
						if(i[4]<4||num[5]!=0){
							
							float left=0;   //初始左边值为0 
							float right = num[1]; //右边的值为第一个数 
							int sign = 1; //表示前一个符号的正负
							
							//此时进行遍历存放四个运算符的i数组
							for(int j=1;j<=4;j++){
								switch(op[i[j]]){
									case '+':
										//如果是正的话,用前一个left进行运算,之后right等于后面的值
										left = left+sign*right;
										sign = 1;   
										right = num[j+1];
										break;
									case '-':
										//如果是负的话,也是用前一个left运算,之后left为
										left = left+sign*right;
										sign = -1;
										right = num[j+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(int j=1;j<=4;j++){
									printf("%d%c",num[j],op[i[j]]);
								}
								printf("%d",num[5]);
								printf("=%d\n",result);
							} 
							
						}
					}
				}
		} 
		}
	}
	if(count == 0){
		printf("没有符合的式子!"); 
	} 
	return 0;
} 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!