问题
形如 5 5 5 5 5 = 5这样的式子,要求给定5个数字,同时给定一个结果;
在这五个数字之间可以填写不同的运算符号,最终使这个等式成立,试通过列出所有的可能。
分析:
这样的题在中小学时候见过不少,只是单纯的求出一种可能比较简单,但要是求解出所有的可能结果,工作量很繁琐,
人工计算也可能有遗漏。要是在程序中通过代码将数学公式写出来就会简单很多。
四则运算中乘除运算优先于加减运算,在进行除法运算时,除数不能为0。
为了解决运算优先级问题,使用left和right变量来保存中间运算结果;
#include<iostream>
using namespace std;
int main()
{
int num[5],i[4],sign,result,count = 0; //五个数字,四个运算符号,符号标志(加减运算需要),结果,计数器
float left, right; //优先级,左右两边保存之前的结果,方便解决运算优先的问题,int是向下取整,会影响结果准确性,在这定义为float型
char oper[4] = {'+', '-', '*', '/' }; //运算符集合
cout << "Please input 5 numbers:";
for (int j = 0; j < 5; j++)
{
cin >> num[j];
}
cout << "Please input the result :";
cin >> result;
for (i[0] = 0; i[0] < 4; i[0]++) //0,1,2,3分别表示+,-,*,/;
{
if ((i[0] < 3) || (num[1] != 0)) //除数不能为0;
{
for (i[1] = 0; i[1] < 4; i[1]++)
{
if ((i[1] < 3) || (num[2] != 0))
{
for (i[2] = 0; i[2] < 4; i[2]++)
{
if ((i[2] < 3) || (num[3] != 0))
{
for (i[3] = 0; i[3] < 4; i[3]++)
{
if ((i[3] < 3) || (num[4] != 0))
{
left = 0; //假定刚开始最左边有一个数,为0;
right = num[0];
sign = 1;
for (int j = 0; j < 4; j++)
{
switch (oper[i[j]])
{
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 (int j = 0; j < 4; j++)
{
printf("%d%c", num[j], oper[i[j]]);
}
printf("%d = %d\n", num[4], result);
}
}
}
}
}
}
}
}
}
if (count == 0)
{
cout << "Error!!!" << endl;
}
cout << "共有符合条件的结果 : " << count <<"种"<< endl;
return 0;
}