枚举法填运算符

输入五个运算数,A B C D E和 一个结果R,然后输出所有运算符能够使得等式 A?B?C?D?E=R成立的可能
具体实现代码:

#include<iostream>
#include<cstring>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
using namespace std;
int main()
{ int j , i [5];
int sign;
int result;
int count=0;
int num[6];
float left ,right;
char oper[5]={' ', '+','-','*','/'};//空一格格子为了程序的可读性 
printf("请输入五个数: ");
for(j = 1; j <=5 ; j++)//1到5 ,共五个运算数 
  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))
  							{
  								left = 0;
  								right = num[1];
  								sign=1;
  								for(j=1;j<=4;j++)
  								{//(1代表'+',2代表'-',3代表'*',4代表'/')
  									switch (oper[i[j]]) //主要讲一下这个switch,符号由{1,1,1,1,1}变成-->{1,1,1,1,2} -->{1,1,1,1,3}-->{1,1,1,1,4} -->{1,1,1,2,1}…  
  									{//然后运算的结果由两个部分组成,左边是指'+'和'-'运算符 比如5 + 5 - 5 * 5 / 5=5
									  //left=0+1*5,接着遇到了'-',然后left= 5+1*5=10(此时sign=-1),然后遇到了'*'right=5*5=25,然后遇到了'/'此时right=25/5=5;
									  //然后结果result=left+sign*right = 10+(-1)*5=5;
									  //如果是5+5*5/5-5=5这种的话,那么,同理,先left = 5 ,然后 right =5*5=25,然后因为'*'后面的是'/' 那么,right=25/5=5;
									  //接着遇到的运算符是'-'则,	left = left+sign*right;(把刚才乘除运算的right 加起来,因为没有遇到- 所以sign=+1),然后right=num[j+1] 移动到最后一个数
									  // 又因为result=left +sign*right=10+(-1)*5==5 将其结果输出 
  										case '+':
  											left = left+sign*right;
  											sign=1;
  											right=num[j+1];
  											break;
  										case '-':
  											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("%3d:",count);
								  	for(j=1;j<=4;j++)
								  	printf("%d%c",num[j],oper[i[j+1]]);
								  	printf("%d=%d\n",num[5],result);
								  }
							  }
						  }
					  }
				  }
			  }
		  }
	  }
   } 
 
if(count==0)
printf("没有符合要求的方法!\n");
getch();
return 0;
}

运行结果如下图:在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是牛大春呀

老板糊涂啊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值