1.问题描述
输入4个整数,运用四则元素,可以加括号,判断其运算结果能不能是24。
2.相关定理
s是一个有理数的集合。
函数f(s)定义如下:
如果s中只有一个元素,则f(s)=s;
否则,f(s)=∪f(s-{r1,r2}+{r}),r1,r2是s中的任意两个元素,r的取值为r1和r2进行四则运算的结果。
因此我们从s中任取两个元素,求其四则运算的结果r,集合中元素的个数就减少了,继续递归下去,最后只剩两个元素,进行四则运算看其结果是否是24。
3.代码
package cn.edu.hit;
import java.util.Scanner;
public class TwentyFour2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] array = new int[4];
for (int i = 0; i < array.length; i++) {
array[i] = in.nextInt();
}
TwentyFour2 t = new TwentyFour2();
if(t.equal(4, array)){
System.out.println(true);
}else{
System.out.println(false);
}
}
public boolean equal(int n,int[] array) {
if(n==1){//只剩最后一个元素
if(array[0]==24){
return true;
}else{
return false;
}
}
for (int i = 0; i < n; i++) {
for (int j = i+1; j < n; j++) {
int a,b;
a = array[i];
b = array[j];
array[j] = array[n-1];//将最后一个数移过来
array[i] = a+b;
if(equal(n-1, array)){
return true;
}
array[i] = a-b;
if(equal(n-1, array)){
return true;
}
array[i] = b-a;
if(equal(n-1, array)){
return true;
}
array[i] = a*b;
if(equal(n-1, array)){
return true;
}
if(b!=0){
array[i] = a/b;
if(equal(n-1, array)){
return true;
}
}
if(a!=0){
array[i] = b/a;
if(equal(n-1, array)){
return true;
}
}
//如果进行以上四则运算不能得到24,则恢复数据,选取其他两个数
array[i] = a;
array[j] = b;
}
}
return false;
}
}