今天在论坛上看到的题目,想到了当年爸爸为了培养我的数学能力拿扑克牌翻四张数字让我组合运算得出24结果,童年的回忆啊!~竟然回想起来了那就拿来做做看,感觉用java来做蛮有意思的。
【题目描述】几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算24点”。
您作为游戏者将得到4个1~9之间的自然数作为操作数,而您的任务是对这4个操作数进行适当的算术运算,要求运算结果等于24。您可以使用的运算只有:+,-,*,/,您还可以使用()来改变运算顺序。注意:所有的中间结果须是整数,所以一些除法运算是不允许的(例如,(2*2)/4是合法的,2*(2/4)是 不合法的)。下面我们给出一个游戏的具体例子: 若给出的4个操作数是:1、2、3、7,则一种可能的解答是1+2+3*7=24。
【输入】只有一行,四个1到9之间的自然数。
【输出】如果有解的话,只要输出一个解,输出的是三行数据,分别表示运算的步骤。其中第一行是输入的两个数和一个运算符和运算后的结果,第二行是第一行的结果和一个输入的数据、运算符、运算后的结果;第三行是第二行的结果和输入的一个数、运算符和“=24”。如果两个操作数有大小的话则先输出大的。 如果没有解则输出“No answer!”
【输入样例】1 2 3 7
【输出样例】
2+1=3
7*3=21
21+3=24
import java.util.ArrayList;
import java.util.List;
class MathDemo {
public int Mjia(int a, int b) {
return a + b;
}
public int Mjian(int a, int b) {
return a - b;
}
public int Mcheng(int a, int b) {
return a * b;
}
public int Mchu(int a, int b) {
return a / b;
}
}
public class TTF_24 {
public static String ttfDemo(List<Integer> numbers) {
MathDemo md = new MathDemo();
for (int num : numbers) {
int[] ynums = new int[4];
int weishu = 1000;
int len = 0;
while (weishu > 0) {
ynums[len] = num / weishu;
num = num % weishu;
weishu = weishu / 10;
len++;
}
//i,k,j分别表示a+b+c+d,a和b之间的运算符,b和c之间的运算符,c和d之间的运算符代表数。
for (int i = 0; i < 4; i++) {
for (int k = 0; k < 4; k++) {
for (int j = 0; j < 4; j++) {
int a = 0;
int b = 0;
int c = 0;
switch (i) {
case 0:
a = md.Mjia(ynums[0], ynums[1]);
break;
case 1:
a = md.Mjian(ynums[0], ynums[1]);
break;
case 2:
a = md.Mcheng(ynums[0], ynums[1]);
break;
case 3:
a = md.Mchu(ynums[0], ynums[1]);
break;
}
switch (k) {
case 0:
b = md.Mjia(a, ynums[2]);
break;
case 1:
b = md.Mjian(a, ynums[2]);
break;
case 2:
b = md.Mcheng(a, ynums[2]);
break;
case 3:
b = md.Mchu(a, ynums[2]);
break;
}
switch (j) {
case 0:
c = md.Mjia(b, ynums[3]);
break;
case 1:
c = md.Mjian(b, ynums[3]);
break;
case 2:
c = md.Mcheng(b, ynums[3]);
break;
case 3:
c = md.Mchu(b, ynums[3]);
break;
}
if (c == 24) { //如果最终结果有24那么返回i,k,j的运算符和a,b,c,d四个数。
String f1 = "";
String f2 = "";
String f3 = "";
switch (i) {
case 0:
f1 = "+";
break;
case 1:
f1 = "-";
break;
case 2:
f1 = "*";
break;
case 3:
f1 = "/";
break;
}
switch (k) {
case 0:
f2 = "+";
break;
case 1:
f2 = "-";
break;
case 2:
f2 = "*";
break;
case 3:
f2 = "/";
break;
}
switch (j) {
case 0:
f3 = "+";
break;
case 1:
f3 = "-";
break;
case 2:
f3 = "*";
break;
case 3:
f3 = "/";
break;
}
//这里的return改成system.out可以得到更多其它24点的结果。有的不仅仅一种结果。
return "(((" + ynums[0] + f1 + ynums[1] + ")" + f2
+ ynums[2] + ")" + f3 + ynums[3] + "=24";
}
}
}
}
}
return "No answer!";
}
//按位数从新组合新的数。
public static Integer newNum(int nums, int num) throws Exception {
int[] ynums = new int[4];
int[] hnums = new int[4];
int[] nnumber = new int[4];
int weishu = 1000;
int len = 0;
while (weishu > 0) {
ynums[len] = num / weishu;
num = num % weishu;
weishu = weishu / 10;
len++;
}
int weishu1 = 1000;
int len1 = 0;
while (weishu1 > 0) {
hnums[len1] = nums / weishu1;
nums = nums % weishu1;
weishu1 = weishu1 / 10;
len1++;
}
int len2 = 0;
for (int wei : ynums) {
nnumber[len2] = hnums[wei - 1];
len2++;
}
return nnumber[0] * 1000 + nnumber[1] * 100 + nnumber[2] * 10
+ nnumber[3];
}
//输入的四个数字排列出来的组合。感觉这么做有点笨,但是想不到其他的方法。
public static List<Integer> arrayNum(int nums) throws Exception {
List<Integer> arrayNumber = new ArrayList<Integer>();
//这里的1234是输入时候的第一、第二、第三、第四位的意思。
int[] xulie = new int[] { 1234, 1243, 1324, 1342, 1423, 1432, 2134,
2143, 2314, 2341, 2413, 2431, 3124, 3142, 3214, 3241, 3412,
3421, 4123, 4132, 4213, 4231, 4312, 4321 };
for (int i : xulie) {
arrayNumber.add(newNum(nums, i));
}
return arrayNumber;
}
public static void main(String[] args) throws Exception {
//int[] num = new int[4];
int nums = Integer.parseInt(javax.swing.JOptionPane
.showInputDialog("请输入四个1-9的整数"));
System.out.println(ttfDemo(arrayNum(nums)));
}
}
输入:1259
结果:(((1+2)*5)+9=24