第十六次CCF CSP认证《24点》python java

本文介绍了如何使用Python和Java解决《24点》问题。Python利用eval()函数的优势,Java则通过查找运算位置和局部运算实现。另外,还提到了Java中利用JavaScript的eval()进行求解的方法。

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

python和java各给出一种解法。

 

python的eval()函数解此题有天然优势。主要需要注意用双斜杠表示除法,保留整数。

a=input();
for i in range(int(a)):
    b=input().replace("x", "*").replace("/", "//");
    if(eval(b)==24):
        print("Yes")
    else:
        print("No")

 

java 

用ArrayList<String>保存数字和符号。

第一步,找出运算位置:当前list中有乘除符号,则运算位置在第一个乘号/除号处。当前list中没有乘除符号,则运算位置在第一个符号处。

第二步,局部运算:根据第一步找到的“运算符的下标”,算出答案,然后用计算结果替换原来的运算三元组(此时list的size也就减少了2)

接着,重复第一、二步,直到算完,这时list.size()==1。可以用递归也可以用循环。

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

public class Main {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		in.nextLine();
		while(n-->0){
			String s=in.nextLine();
			ArrayList<String>list=new ArrayList<>(); 
			for(int i=0;i<7;i++){
				list.add(s.substring(i,i+1));
			}
			if(f(list)==24)
				System.out.println("Yes");
			else
				System.out.println("No");
		}
	}
	public static int f(ArrayList<String>list){//递归计算
		if(list.size()==1)//递归出口
			return Integer.parseInt(list.get(0));
		for(int i=0;i<list.size();i++){
			if(list.get(i).equals("x")||list.get(i).equals("/")){
				list.set(i,""+f2(list.get(i-1),list.get(i),list.get(i+1)));
				list.remove(i+1);
				list.remove(i-1);
				return f(list);
			}
		}
		list.set(1,""+f2(list.get(0),list.get(1),list.get(2)));
		list.remove(2);
		list.remove(0);
		return f(list);
	}
	public static int f2(String x1,String x2,String x3){//计算一个短式子
		int a=Integer.parseInt(x1);
		int b=Integer.parseInt(x3);
		if(x2.equals("+"))
			return a+b;
		else if(x2.equals("-"))
			return a-b;
		else if(x2.equals("x"))
			return a*b;
		else return a/b;
	}
}

Java的另一种解法

在java里外链js 使用js中的eval(),本地测试没问题。

import java.util.Scanner;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		in.nextLine();
		while (n-- > 0) {
			if (f(in.nextLine().replaceAll("x", "*")) == 24) 
				System.out.println("Yes");
			else
				System.out.println("No");
		}
	}

	private static int f(String c) {//计算算式
		//除号处理
		char[]b=c.toCharArray();
		if(b[1]=='/'  && b[5]=='/'&&(b[3]=='*'||b[3]=='/'))
	        c="Math.floor(Math.floor(Math.floor("+b[0]+"/"+b[2]+")"+b[3]+b[4]+")/"+b[6]+")";
		else if(b[1]=='/' && b[5]=='/')
	        c="Math.floor("+b[0]+"/"+b[2]+")"+b[3]+"Math.floor("+b[4]+"/"+b[6]+")";
	    else
	        if(b[1]=='/')
	            c="Math.floor("+b[0]+"/"+b[2]+")"+c.substring(3);
	        else if(b[5]=='/')
	            c=c.substring(0,4)+"Math.floor("+c.substring(4)+")";
           //除号处理 end
		Object res=eval(c);//注意当有除号时,返回Double。
		if(res instanceof Integer)
			return ((Integer) res).intValue();
		else return((Double)res).intValue();
	}

	//java调用js的eval
	private static Object eval(String s) {
		Object result = null;
		ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");
		try {
			result = jse.eval(s);
		} catch (ScriptException e) {
			e.printStackTrace();
		}
		return result;
	}
}

 

### 关于第36次 CCF CSP 认证中的 Python 考试大纲 在第36次 CCF CSP认证中,Python相关内容主要依据《NOI 大纲》以及 CSP 初赛的知识体系进行考察[^1]。具体而言,考试范围涵盖了数据结构、算法设计与分析、程序设计基础等多个方面。 #### 一、考试大纲概述 根据官方发布的 CSP 初赛知识框架,Python 的考试重可以分为以下几个部分: 1. **基本语法** - 变量定义与赋值操作。 - 基础控制流语句(`if`, `for`, `while` 等)。 2. **函数与模块** - 函数的定义与调用机制。 - 参数传递方式及其作用域规则。 - 标准库常用模块的应用(如 `math`, `random`, `collections` 等)。 3. **数据结构** - 列表(List)、元组(Tuple)、字典(Dictionary)、集合(Set)的操作方法。 - 文件读写功能实现。 4. **算法初步** - 排序算法(冒泡排序、快速排序等)。 - 查找算法(二分查找等)。 - 动态规划思想简介。 5. **复杂度分析** - 时间复杂度计算原则。 - 空间复杂度评估要。 #### 二、真题解析示例 以下是基于过往 CSP-J/S 中涉及 Python 题目的典型例子之一: **题目描述**: 给定一个长度为 n (n ≤ 10^5) 的整数数组 A 和目标值 k,请找出是否存在两个不同的索引 i,j 满足 Ai + Aj = k 。如果存在返回 true;否则返回 false。 **解决方案**: ```python def two_sum(nums, target): num_to_index = {} for index, value in enumerate(nums): complement = target - value if complement in num_to_index: return True num_to_index[value] = index return False ``` 上述代码通过哈希表优化了暴力枚举的时间开销 O(n²),从而降低至线性时间复杂度 O(n)[^1]。 --- #### 三、数据分析与成绩统计 对于第36次 CSP 认证的成绩分布情况,可参考历年 CSP-J1/CSP-S1 各省分数线汇总资料[^2]。通常情况下,各省会根据不同难度等级设定晋级比例或者固定分数门槛来决定最终入围名单。 此外,《欢迎订阅我的专栏:算法题解——C++与Python 实现!》提供了丰富的练习资源和实战案例分享[^3],有助于考生进一步巩固所学知识并提高实际解决问题的能力。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值