总时间限制: 3000ms 内存限制: 65536kB
描述
给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。
这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法)。
比如,对于5,5,5,1,我们知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,对于1,1,4,2,我们怎么都不能得到24。
输入
输入数据包括多行,每行给出一组测试数据,包括4个小于10个正整数。最后一组测试数据中包括4个0,表示输入的结束,这组数据不用处理。
输出
对于每一组测试数据,输出一行,如果可以得到24,输出“YES”;否则,输出“NO”。
样例输入
5 5 5 1
1 1 4 2
0 0 0 0
样例输出
YES
NO
Accepted代码
import java.util.Scanner;
public class Main {
public static boolean IsZero(double a) {
return Math.abs(a)<=0.000001;
}
public static boolean count24(double[] num,int n) {
if (n==1) {
if (IsZero(num[0]-24))
return true;
else
return false;
}
double[] a=new double[5];
for (int i=0;i<n-1;i++) {
for (int j=i+1;j<n;j++) {
int m=0;
for(int k=0;k<n;k++) {
if(k!=i && k!=j)
a[m++]=num[k];
}
a[m]=num[i]+num[j];
if(count24(a,m+1)) return true;
a[m]=num[i]-num[j];
if(count24(a,m+1)) return true;
a[m]=num[j]-num[i];
if(count24(a,m+1)) return true;
a[m]=num[i]*num[j];
if(count24(a,m+1)) return true;
if (!IsZero(num[j])) {
a[m]=num[i]/num[j];
if(count24(a,m+1)) return true;
}
if(!IsZero(num[i])) {
a[m]=num[j]/num[i];
if(count24(a,m+1)) return true;
}
}
}
return false;
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
double[] num=new double[5];
while(true) {
for(int i=0;i<4;i++)
num[i]=in.nextDouble();
if(num[0]==0) break;
if(count24(num,4))
System.out.println("YES");
else
System.out.println("NO");
}
in.close();
}
}