题目描述
给出4个正整数操作数,你的任务是使用运算符(+,-,*,/)和括号对操作数进行计算,分析是否能得到24,每个操作数只能使用1次,运算符和括号可以多次使用,注意所有的中间结果都是整数。
输入
输入包括多行,每行4个正整数,范围是[1,13],输入以0 0 0 0标记结束
输出
若输入的4个操作数能计算出24,输出Yes,否则输出No
样例输入
1 1 1 1
2 5 7 8
0 0 0 0
样例输出
No
Yes
#include<iostream>
#include<string.h>
using
namespace
std;
double
x[4]; //输入的4个整数
int
f(int
n)
{
if
(n==1)
{
if
(x[0]==24)
return
1;
else
return
0;
}
for
(
int
i=0;i<n;i++)
{
for
(
int
j=i+1;j<n;j++) //从数组中任取两个数的组合
{
double
a,b;
a=x[i];
b=x[j];
x[j]=x[n-1];
//将第一个数覆盖掉,长度减一
//运算
//
a+b
x[i]=a+b;
if
(f(n-1))
return
1;
//
a-b
x[i]=a-b;
if
(f(n-1))
return
1;
//
b-a
x[i]=b-a;
if
(f(n-1))
return
1;
//
a*b
x[i]=a*b;
if
(f(n-1))
return
1;
if
(b!=0)
{
//
a/b
x[i]=a/b;
if
(f(n-1))
return
1;
}
if
(a
!= 0)
{
//
b/a
x[i]=b/a;
if
(f(n-1))
return
1;
}
x[i]=a;
//将数组还原
x[j]=b;
}
}
return
0;
}
int
main()
{
while
(cin>>x[0]>>x[1]>>x[2]>>x[3])
{
if
(x[0]!=0||x[1]!=0||x[2]!=0||x[3]!=0)
{
if
(f(4))
cout
<<"Yes"
<<
endl;
else
cout
<< "No"
<< endl;
}
else
return
0;
}
return
0;
}
通过递归循环,暴力穷举,计算每两个数之间的每种运算
若找到满足,则返回1并跳出循环,在每一次运算后还需将数组还原