问题描述:输入 5 个数与一个结果,设计程序在 5 个数中填入运算符( + - * /)使其与结果相等,或回答做不到。5个数顺序固定,运算顺序固定为从左向右,不考虑运算符优先性。除法按整数除法来运算,保证有解的输入都是有唯一解的。
输入形式:5个整数a, b, c, d, e和一个结果整数result。0<a,b,c,d,e<=50。
输出形式:依次输出4个运算符,以空格隔开;没有解时输出"No solution"。
如何遍历各种情况呢?一共64种填入可能,如何穷举完全?
#include <stdio.h>
#include <stdbool.h>
char *szOpt[4] = {"+","-","*","/"};
bool inputCheck(char *szName,int iValue)
{
if(iValue <= 0 || iValue > 50)
{
printf("%s is %d,but need to [1,50].\nplease input again\n",szName,iValue);
return false;
}
return true;
}
int calcValue(int iVal1,int iVal2,int iOpt)
{
switch(iOpt)
{
case 0:
return iVal1 + iVal2;
case 1:
return iVal1 - iVal2;
case 2:
return iVal1 * iVal2;
case 3:
return iVal1 / iVal2;
default:
break;
}
return 0;
}
void printResult(int i,int j,int k,int l)
{
printf("Opt is:%s %s %s %s\n",szOpt[i],szOpt[j],szOpt[k],szOpt[l]);
}
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
int ret = 0;
while(1)
{
scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&ret);
if(!inputCheck("a",a) || !inputCheck("b",b) || !inputCheck("c",c)
|| !inputCheck("d",d) || !inputCheck("e",e))
{
continue;
}
break;
}
int i = 0;
int j = 0;
int k = 0;
int l = 0;
int iCalcBak = 0;
int iCalc = 0;
for(i = 0;i < 4;i++)
{
int iCalc1 = calcValue(a,b,i);
for(j = 0;j < 4;j++)
{
int iCalc2 = iCalc1;
iCalc2 = calcValue(iCalc2,c,j);
for(k = 0;k < 4;k++)
{
int iCalc3 = iCalc2;
iCalc3 = calcValue(iCalc3,d,k);
for(l = 0;l < 4;l++)
{
int iCalc4 = iCalc3;
iCalc4 = calcValue(iCalc4,e,l);
if(iCalc4 == ret)
{
printResult(i,j,k,l);
return 0;
}
}
}
}
}
printf("No solution\n");
return 0;
}