一想到枚舉,就是暴力,近日在看算法書,感覺厘清思想比較重要,是以來寫下一點自己的感想。
例題:
在 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;
}