CSP 201903-2二十四点(Java)

本文分享了一种解决含乘除优先级的四则运算题目的算法思路与Java实现。通过先处理乘除再处理加减,实现了正确运算顺序,最终得出结果。作者邀请读者提出改进建议。

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

       个人感觉这个题最关键的地方是对加减乘除符号的处理,在刚开始做的时候想了很长时间没想到很好的办法,因为乘除的优先级高于加减,如果只是顺序运算则一定不对,最后决定在写出式子之后直接对乘除运算进行处理,首先从左到右依次找到x和/符号,然后找到符号前后的数字,将整体(符号前的数+符号+符号后的数)用其运算结果代替,一直到式子中只剩+和-,然后就从左到右加减运算得到最终结果。

       代码如下:

import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.nextLine();
		for(int i=0;i<n;i++) {
			String str = sc.nextLine();
			int j = 0;
			while(str.indexOf("/")!=-1 || str.indexOf("x")!=-1) {		//因为乘除优先级高,所以首先对所有的'x'和'/'进行处理
				if(str.indexOf("/")!=-1 && str.indexOf("x")!=-1)    //乘除都有
					j = Math.min(str.indexOf("/"),str.indexOf("x"));	//乘除同级别,从左到右顺序计算,谁在前先算谁
				else if(str.indexOf("/")!=-1 && str.indexOf("x")==-1)    //只有除没有乘
					j = str.indexOf("/");
				else if(str.indexOf("/")==-1 && str.indexOf("x")!=-1)    //只有乘
					j = str.indexOf("x");
				if(j!=-1) {												//在找到一个乘号或者一个除号的时候
					String tmp1 = "";
					int k = 1;
					while(j-k>=0 && str.charAt(j-k)>='0' && str.charAt(j-k)<='9') {		//找到符号前面的数,j-k是为防止检索到-1越界
						tmp1 = str.charAt(j-k)+tmp1;
						k++;
					}
					String tmp2 = "";
					k = 1;
					while(j+k<str.length() && str.charAt(j+k)>='0' && str.charAt(j+k)<='9') {	//找到符号后面的数,j+k是为防止检索到str.length()越界
						tmp2 += str.charAt(j+k);
						k++;
					}
					//用计算的结果替换原来乘法或者除法的运算
					if(str.charAt(j)=='/') {
						String restr = (Integer.parseInt(tmp1) / Integer.parseInt(tmp2))+"";
						str = str.replaceAll(tmp1+str.charAt(j)+tmp2, restr);
					}
					else if(str.charAt(j)=='x') {
						String restr = (Integer.parseInt(tmp1) * Integer.parseInt(tmp2))+"";
						str = str.replaceAll(tmp1+str.charAt(j)+tmp2, restr);
					}
						
				}
			}
			//在上面的操作完成后剩下得只有加减法运算,优先级同级顺序运算即可。
			int tmp = 0;
			int Sum = 0;
			char f = '+';		//因为Sum=0,第一个操作是Sum一定是加第一个数,所以设符号f为'+'
			for(j=0;j<str.length();j++) {
				if(str.charAt(j)>='0' && str.charAt(j)<='9') {
					tmp = tmp*10 + (str.charAt(j)-'0');
				}
				else {	//在找到下一个符号的时候完成上一个符号的加减操作然后用新找到符号替换原符号
					if(f == '+')
						Sum += tmp;
					else 
						Sum -= tmp;
					f = str.charAt(j);
					tmp = 0;
				}
				if(j==str.length()-1) {		//Sum +或-最后一个数
					if(f == '+')
						Sum += tmp;
					else 
						Sum -= tmp;
				}	
			}
			//输出结果
			if(Sum == 24) {
				System.out.println("Yes");
			}
			else
				System.out.println("No");
		}
	}
}

       提交结果得了满分,应该没什么太大的问题,但是整体过程好像还是有点复杂,我没有想到很好的简单方法。如果有不同思路或者对我写的代码有不同看法的欢迎大家提出,共同进步。

### 关于CSP 2022年6月第二次考试Java题解 对于CSP 2022年6月第二次考试中的题目解答,虽然提供的参考资料未直接提及此次考试的具体内容,但从其他月份的考题分析中可以获得一些通用的方法论和技巧。 #### 题目特点与应对策略 通常情况下,CSP竞赛会涉及算法设计、数据结构应用等方面的知识。针对不同类型的题目,采取相应的解决方法至关重要: - **逻辑运算处理**:当遇到像逻辑表达式的解析这类问题时,可以通过构建语法树的方式简化复杂度,并采用递归下降法实现对输入字符串的有效解析[^2]。 - **现值计算类问题**:面对金融数学领域内的现值折算等问题,则需运用到指数函数及其逆操作——对数函数来进行精确数值转换;同时要注意浮点数精度损失带来的潜在误差[^3]。 - **规划调度型试题**:如训练计划安排等场景下,动态规划或是贪心算法往往能提供高效解决方案。特别是涉及到前置条件约束的情况下,前缀和的概念可以帮助快速定位最优解路径[^4]。 - **序列变换挑战**:有关数组元素间关系推理的任务可能要求考生掌握诸如前缀最大/最小值维护之类的高级技巧来优化性能表现[^5]。 ```java // 示例代码片段展示如何读取并初步处理输入数据(假设为整数列表) import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); List<Integer> numbers = new ArrayList<>(); while (scanner.hasNextInt()) { numbers.add(scanner.nextInt()); } // 进一步业务逻辑处理... } } ``` 尽管上述讨论并非特指某一道具体赛题,但这些原则性的指导方针适用于大多数编程比赛场合之中。为了更好地准备特定日期的比赛项目,建议查阅官方发布的历年真题集以及社区内分享的成功经验帖获取更详尽的信息资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值