算24点



今天在论坛上看到的题目,想到了当年爸爸为了培养我的数学能力拿扑克牌翻四张数字让我组合运算得出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






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Python 代码实现,可以解决去除重复项的 24 点游戏问题: ```python from itertools import permutations def solve24(nums): for p in permutations(nums): # try all possible orders of nums for i in range(1, 4): # try all possible positions to add, subtract, multiply, divide for j in range(1, 4): for k in range(1, 4): if i != j and i != k and j != k: # avoid duplicate operations if j < i: a, b = j, i else: a, b = i, j if k == 1: exp = '(' + str(p[a-1]) + '+' + str(p[b-1]) + ')' c = p[a-1] + p[b-1] elif k == 2: exp = '(' + str(p[a-1]) + '-' + str(p[b-1]) + ')' c = p[a-1] - p[b-1] elif k == 3: exp = '(' + str(p[a-1]) + '*' + str(p[b-1]) + ')' c = p[a-1] * p[b-1] else: if p[b-1] == 0: continue exp = '(' + str(p[a-1]) + '/' + str(p[b-1]) + ')' c = p[a-1] / p[b-1] for m in range(1, 5): if m != a and m != b: # avoid duplicate numbers if m < b: x, y = m, b else: x, y = b, m if x < a: w, z = x, a else: w, z = a, x if m == 1: exp1 = '(' + str(c) + '+' + str(p[y-1]) + ')' res = c + p[y-1] elif m == 2: exp1 = '(' + str(c) + '-' + str(p[y-1]) + ')' res = c - p[y-1] elif m == 3: exp1 = '(' + str(c) + '*' + str(p[y-1]) + ')' res = c * p[y-1] else: if p[y-1] == 0: continue exp1 = '(' + str(c) + '/' + str(p[y-1]) + ')' res = c / p[y-1] if z == 3: exp2 = '(' + exp + '+' + exp1 + ')' result = res + p[z-1] else: exp2 = '(' + exp + '*' + exp1 + ')' result = res * p[z-1] if abs(result-24) < 1e-6: return exp2 + ' = 24' return 'No solution' ``` 该函数的输入是一个长度为 4 的列表,表示 4 个数字,输出是一个字符串,表示如何通过加、减、乘、除四种运得到 24。如果没有这样的方案,输出 "No solution"。 这个函数的核心思想是暴力枚举所有可能的运顺序和运符号,然后计出所有可能的表达式的值,最后判断是否有等于 24 的结果。为了避免重复计和无效的表达式,我们使用了一些技巧,比如使用 itertools 模块中的 permutations 函数来生成所有可能的数字排列,使用多重循环来枚举所有可能的运顺序和运符号,使用条件判断来避免重复计和无效的表达式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值