CSP_201903-2_二十四点(Java,满)

试题编号:201903-2
试题名称:二十四点
时间限制:1.0s
内存限制:512.0MB
在这里插入图片描述在这里插入图片描述

方法一:
在这里插入图片描述

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
	static Scanner input = new Scanner(System.in);

	public static void main(String[] args) {
		int n = input.nextInt();
		ArrayList<Integer> nums = new ArrayList<Integer>();

		for (int i = 0; i < n; i++) {
			nums.clear();//清空列表
			String expr = input.next();//expr:表达式
			for (int j = 0;;) {
				nums.add(expr.charAt(j) - '0');// char转int
				if (++j == 7) {// 先运算后赋值
					break;
				}
				nums.add((int) expr.charAt(j++));// 先赋值后运算
			}
			for (int j = 1; j < nums.size(); j += 2) {
				if (nums.get(j) == 'x' || nums.get(j) == '/') {
					nums.set(j - 1,
							way(nums.get(j - 1), nums.get(j + 1), nums.get(j)));
					//set(下标,值)
					nums.remove(j + 1);
					nums.remove(j);
					j -= 2;
				}
			}
			for (int j = 1; j < nums.size(); j += 2) {
				nums.set(j - 1,
						way(nums.get(j - 1), nums.get(j + 1), nums.get(j)));
				nums.remove(j + 1);
				nums.remove(j);
				j -= 2;
			}
			if (nums.get(0) == 24) {
				System.out.println("Yes");
			} else {
				System.out.println("No");
			}
		}
	}

	static int way(int a, int b, int operator) {
		switch (operator) {
		case '+':
			return a + b;
		case '-':
			return a - b;
		case 'x':
			return a * b;
		case '/':
			return a / b;
		}
		return 0;
	}

}

方法二:

在这里插入图片描述

import java.util.Scanner;

public class Main {
	static Scanner input = new Scanner(System.in);

	public static void main(String[] args) {
		int n = input.nextInt();
		int num[] = new int[7];
		for (int i = 0; i < n; i++) {//循环n次
			String s = input.next();
			for (int m = 0; m < 7; m++) {//每行自己循环
				num[m] = s.charAt(m);
			}
			for (int j = 0; j <= 4; j += 2) {// 循环三次
				if (num[j + 1] == 'x' || num[j + 1] == '/') {
					num[j + 2] = '0' + way(num[j], num[j + 2], num[j + 1]);
					num[j] = '0';
					num[j + 1] = j==0?'+':num[j-1];
				}
			}
			for (int k = 0; k <= 4; k += 2) {
				if (num[k + 1] == '+' || num[k + 1] == '-') {
					num[k + 2] = '0' + way(num[k], num[k + 2], num[k + 1]);
				}
			}
			if (num[6] == '0' + 24) {
				System.out.println("Yes");
			} else {
				System.out.println("No");
			}

		}
	}

	static int way(int a, int b, int operator) {
		int a1 = a - '0';
		int b1 = b - '0';
		switch (operator) {
		case '+':
			return a1 + b1;
		case '-':
			return a1 - b1;
		case 'x':
			return a1 * b1;
		case '/':
			return a1 / b1;
		}
		return 0;
	}

}

方法三:
在这里插入图片描述

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		while (n-- > 0)
			System.out.println(calc(in.next()) == 24 ? "Yes" : "No");
	}

	static int calc(String expr) {
		int sum = 0; // 加减的计算结果
		int product = expr.charAt(0) - '0'; // 记录每个乘除项的计算结果
		for (int pos = 1; pos < 7;) {
			char op = expr.charAt(pos++);
			int number = expr.charAt(pos++) - '0';
			switch (op) {
				case '+':
				case '-':
					sum += product; // 遇到加减号就把之前的 product 加进 sum 中
					product = op == '+' ? number : -number; // 加减运算转为正负处理
					break;
				case 'x':
					product *= number;
					break;
				case '/':
					product /= number;
			}
		}
		return sum + product; // 把最后一项加上
	}

}
/*
10
9+3+4x3
5+4x5x5
7-9-9+8
5x6/5x4
3+5+7+9
1x1+9-9
1x9-5/9
8/5+6x9
6x7-3x6
6x4+4/5

*/

题目链接:http://118.190.20.162/view.page?gpid=T88

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值