一想到枚举,就是暴力,近日在看算法书,感觉厘清思想比较重要,所以来写下一点自己的感想。
例题:
在 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;
}