华为OD机试统一考试D卷C卷 - 符号运算
题目描述
给定一个表达式,求其分数计算结果。
表达式的限制如下:
- 所有的输入数字皆为正整数(包括0)
- 仅支持四则运算(+-*/)和括号
- 结果为整数或分数,分数必须化为最简格式(比如6,3/4,7/8,90/7)
- 除数可能为0,如果遇到这种情况,直接输出"ERROR"
- 输入和最终计算结果中的数字都不会超出整型范围
用例输入一定合法,不会出现括号匹配的情况
输入描述
字符串格式的表达式,仅支持+-*/,数字可能超过两位,可能带有空格,没有负数
长度小于200个字符
输出描述
表达式结果,以最简格式表达
- 如果结果为整数,那么直接输出整数
- 如果结果为负数,那么分子分母不可再约分,可以为假分数,不可表达为带分数
- 结果可能是负数,符号放在前面
用例
输出 | 43/8 |
说明 | 无 |
输出 | -1/5 |
说明 | 符号需要提到最前面 |
输出 | 12 |
说明 | 注意括号可以多重嵌套 |
Java
import java.util.*;
public class Main {
public static void main(String[] args) {
// 创建扫描器读取输入
Scanner scanner = new Scanner(System.in);
// 读取一行表达式
String expression = scanner.nextLine();
// 关闭扫描器
scanner.close();
try {
// 尝试计算表达式结果
Fraction result = calculate(expression);
// 输出计算结果
System.out.println(result);
} catch (ArithmeticException e) {
// 捕获并处理算术异常,比如除以0
System.out.println("ERROR");
}
}
private static Fraction calculate(String expression) {
// 创建两个栈,一个用于存储数字,一个用于存储操作符
Stack<Fraction> numbers = new Stack<>();
Stack<Character> operators = new Stack<>();
// 遍历表达式的每个字符
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
// 如果当前字符是数字
if (Character.isDigit(c)) {
int j = i;
// 继续向后读取直到非数字字符
while (j < expression.length() && Character.isDigit(expression.charAt(j))) {
j++;
}
// 将读取到的数字字符串转换为Fraction对象并入栈
Fraction number = new Fraction(Integer.parseInt(expression.substring(i, j)), 1);
numbers.push(number);
i = j - 1;
} else if (c == '(') {
// 如果是左括号,直接入操作符栈
operators.push(c);
} else if (c == ')') {
// 如果是右括号,计算到最近一个左括号为止
while (operators.peek() != '(') {
calculate(numbers, operators);
}
// 弹出左括号
operators.pop();
} else if (c
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2024华为OD机试题库D卷 文章被收录于专栏
本专栏给大家提供了华为2024最新华为OD(D)卷的题目汇总。华为OD机试刷题记录机考算法题库,帮助你上岸华为。提供C++/Java、JavaScript、Python四种语言的解法。