2026/2/11 21:56:40
网站建设
项目流程
网站开发技术试验教程,金融网站模板免费下载,想建个图片网站,广州富邦物流网站建设(新卷,100分)- 火星文计算#xff08;Java JS Python#xff09;
题目描述
已知火星人使用的运算符为#、$#xff0c;其与地球人的等价公式如下#xff1a;
x#y 2*x3*y4
x$y 3*xy2
其中x、y是无符号整数地球人公式按C语言规则计算火星人公式中#xff…(新卷,100分)- 火星文计算Java JS Python题目描述已知火星人使用的运算符为#、$其与地球人的等价公式如下x#y 2*x3*y4x$y 3*xy2其中x、y是无符号整数地球人公式按C语言规则计算火星人公式中$的优先级高于#相同的运算符按从左到右的顺序计算现有一段火星人的字符串报文请你来翻译并计算结果。输入描述火星人字符串表达式结尾不带回车换行输入的字符串说明字符串为仅由无符号整数和操作符#、$组成的计算表达式。例如123#4$5#67$78。用例保证字符串中操作数与操作符之间没有任何分隔符。用例保证操作数取值范围为32位无符号整数。保证输入以及计算结果不会出现整型溢出。保证输入的字符串为合法的求值报文例如123#4$5#67$78保证不会出现非法的求值报文例如类似这样字符串#4$5 //缺少操作数4$5# //缺少操作数4#$5 //缺少操作数4 $5 //有空格34-5*6/7 //有其它操作符12345678987654321$54321 //32位整数计算溢出输出描述根据输入的火星人字符串输出计算结果结尾不带回车换行。用例输入7#6$5#12输出226说明7#6$5#127#(3*652)#127#25#12(2*73*254)#1293#122*933*124226题目解析该题目确保了输入字符串格式严格遵循数字操作符数字的模式不会出现非法求值报文因此非常适合使用正则表达式进行匹配处理。解题步骤如下使用正则表达式匹配操作数$操作数的模式将匹配到的表达式替换为计算结果此时字符串中仅剩#分隔符按照#对字符串进行分割从左至右对相邻两个操作数进行计算通过以上步骤即可得出最终解答。这里不同语言的字符串首次匹配替换的API功能各有差异JSreplaceString.prototype.replace() - JavaScript | MDN (mozilla.org)JavareplaceFirstString (Java Platform SE 8 ) (oracle.com)PythonreplacePython replace()方法 | 菜鸟教程 (runoob.com)其中JS字符串的replace只替换第一次匹配符合要求。Java的replce方法是替换所有匹配而replaceFirst方法是替换第一次匹配但是需要注意的是replaceFirst方法的第一个参数匹配串将被用作正则表达式的内容而$又是正则表达式的元字符因此我们需要对$进行转义当成普通字符使用。Python的replace方法是替换所有匹配但是我们可以通过replace第三个参数来控制最大替换次数。JavaScript算法源码/* JavaScript Node ACM模式 控制台输入获取 */ const path require(path); const readline require(readline); const rl readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.on(line, (line) { console.log(huoxin(line)); }); function huoxin(str) { const regExp /\d\$\d/; while (str.indexOf($) ! -1) { str str.replace(regExp, (match) operate$(match).toString()); } return str .split(#) .map(Number) .reduce((x, y) 2 * x 3 * y 4); } function operate$(str) { const i str.indexOf($); const x parseInt(str.slice(0, i)); const y parseInt(str.slice(i 1)); return 3 * x y 2; }Java算法源码import java.util.Arrays; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Other { public static void main(String[] args) { Scanner sc new Scanner(System.in); String str sc.next(); System.out.println(getResult(str)); } public static long getResult(String str) { Pattern p Pattern.compile((\\d)\\$(\\d)); while (true) { Matcher m p.matcher(str); if (!m.find()) break; String subStr m.group(0); long x Long.parseLong(m.group(1)); long y Long.parseLong(m.group(2)); str str.replaceFirst(subStr.replace($, \\$), 3 * x y 2 ); } return Arrays.stream(str.split(#)) .map(Long::parseLong) .reduce((x, y) - 2 * x 3 * y 4) .orElse(0L); } }Python算法源码import re # 输入获取 s input() # 算法入口 def getResult(s): p re.compile((\\d)\\$(\\d)) while True: m p.search(s) if m: subS m.group() x int(m.group(1)) y int(m.group(2)) s s.replace(subS, str(3 * x y 2), 1) # 注意这里replace只能进行替换第一次出现的不能替换多次因此replace方法第三个参数为1表示只替换首次匹配 else: break arr list(map(int, s.split(#))) x arr[0] for y in arr[1:]: x 2 * x 3 * y 4 return x # 算法调用 print(getResult(s))