java蓝桥杯 24点问题

本文介绍了一种解决24点游戏的算法实现方案。该算法通过随机组合四则运算符,对输入的四个数字进行多种运算组合尝试,以找出能够得出24的运算表达式。文中详细解释了算法流程,包括随机生成运算符、打乱数字顺序、运算验证及表达式展示等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

给出a, b, c, d四个数且1<=a, b, c, d<=10;

对这四个数使用加减乘除运算,判断这四个数的能否等于24;

能的话输出表达式(可能有多个表达式)

例如

输入

2 2 2 3

输出

2*2*2*3(或其他表达式)

 

代码如下:

public class Main{
	
	public static String random_p() {
		int a = (int)(Math.random()*4);
		if (a==1) return "+";
		if (a==2) return "-";
		if (a==3) return "*";
		return "/";
	}
	
	public static void shuffle(String[] data) {
		for(int i=0; i<data.length; i++) {
			int j = (int)(Math.random()*data.length);
			String temp = data[i];
			data[i] = data[j];
			data[j] = temp;
		}
	}
	
	public static int op(int a, int b, String oper) throws Exception {
		if (oper.equals("+")) return a+b;
		if (oper.equals("-")) return a-b;
		if (oper.equals("*")) return a*b;
		if(a%b != 0) throw new Exception("not /");
		return a / b;
	}
	
	public static boolean jisuan(String[] data) {
		Stack stk = new Stack();
		try {
			for(int i=0; i<data.length; i++) {
				if(data[i].equals("+") || data[i].equals("-") 
						||data[i].equals("*") || data[i].equals("/")) {
					int a = Integer.parseInt((String) stk.pop());
					int b = Integer.parseInt((String) stk.pop());
					try {
						stk.push(op(a, b, data[i]) + "");
					} catch (Exception e) {
						// TODO Auto-generated catch block
						return false;
					}
				}
				else {
					stk.push(data[i]);
				}
			}
		}
		catch (Exception e) {return false;}
		if (stk.size()==1 && stk.pop().equals("24")) return true;
		return false;
	}
	
	public static void show(String[] data) {
		Stack stk = new Stack();
		
			for(int i=0; i<data.length; i++) {
				if(data[i].equals("+") || data[i].equals("-") 
						||data[i].equals("*") || data[i].equals("/")) {
					stk.push("(" + stk.pop() + data[i] + stk.pop() + ")");
				}
				else {
					stk.push(data[i]);
				}
			}
		
		
		
		System.out.println(stk.pop());
	}
	
	public static void f(String[] ss) {
		for (int k=0; k<1000*100; k++) {
			String[] buf = new String[7];
			for(int i=0; i<4; i++) buf[i] = ss[i];
			for(int i=4; i<7; i++) buf[i] = random_p();
			shuffle(buf);
			if(jisuan(buf)) {
				show(buf);
				break;
			}
		}
		
	}
	
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String[] ss = null;
		while(true) {
			System.out.println("请输入四个整数:");
			ss = scan.nextLine().split(" +");
			f(ss);
		}
		
	}
}

这道题的思路是先创建一个buf数组,长度为7,前四个元素是随机输入的四个数字,

后三个利用随机数从“+”,“-”,“*”,“/“ 四个符号中选择三个,然后将他们进行组合,

因此这是通过多次模拟去寻找正确答案。这个方法次数越多越管用。

shuffle函数把buf数组中的元素随机的两两交换,打乱里面的顺序。jisuan函数来判断

四个数字的组合能否满足等于24的要求。这里使用了中缀表达式的知识。通过栈每次

弹出两个数字,运算得到结果后再压入栈中。为了将整个表达式可视化出来,又写了

一个show方法。每次压入栈中的不是计算结果,而是计算公式。

要注意的是异常的使用,jisuan函数中当栈为空时再pop会报异常,因此需要处理。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值