枚举小结

一想到枚举,就是暴力,近日在看算法书,感觉厘清思想比较重要,所以来写下一点自己的感想。

例题:

a  b  c  d  e  = f  (a~f为0~9))  添加+、-、*、/ 号来使得等式成立。

分析该式子,由5个数构成的算式,一共需要填入4个运算符,注意点:

1、除法分母不为0 

2、乘除法运算级别优先于加减法

思路: 两个变量 left 和 right 分别保存上次运算结果(下次运算的左侧内容)和下次参加运算的数据(下次运算的右侧内容)

           比如 5 + 5 - 5 * 5 / 5 = 5,left = 5 + 5   right = 5 * 5 / 5

#include <cstdio>
#include <cstring> 
char op[5]={' ','+','-','*','/'};
int num[10];
int main()
{
	int i[5],j,temp,result,ans=0;
	printf("请输入5个数:");
	for(j=1;j<=5;j++)
	  scanf("%d",&num[j]);
    printf("请输入结果:");
    scanf("%d",&result);
    double left,right;
    for(i[1]=1;i[1]<=4;i[1]++) //循环四种运算符,1表示 +,2表示 —,3表示 *,4表示 / 
	{      
		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];
		 							temp=1;
		 							for(j=1;j<=4;j++)
		 							{
							 			switch(op[i[j]])
							 			{
			 								case '+':
			 								     left=left+temp*right;
			 								     temp=1;
			 								     right=num[j+1];
			 								     break;
							                case'-':
							                     left=left+temp*right;
							                     temp=-1;
							                     right=num[j+1];
							                     break;
		                                    case'*':
							                     right=right*num[j+1];
							                     break;
		                                    case'/':
							                     right=right/num[j+1];
							                     break;
			 							}
							 		}
							 		if(left+temp*right==result)
							 		{
		 								ans++;
		 								printf("%3d: ",ans);
		 								for(j=1;j<=4;j++)
		 								{
								 			printf("%d%c",num[j],op[i[j]]);
								 		}
								 		printf("%d=%d\n",num[5],result);
		 							}
		 						}
						 	}
	 					}
				    }
		      }	
   		   }	
		}
	} 
    if(ans==0)printf("没有符合要求的方法\n");
	return 0; 
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值