枚举法解决“给定运算数字和结果,列举出所有可能的问题如5 5 5 5 5 = 5”

问题

形如 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;
}

猜你喜欢

转载自blog.csdn.net/Crazy__1/article/details/88292326
5
-5