华为OD机试统一考试D卷C卷 - 符号运算

题目描述

给定一个表达式,求其分数计算结果。

表达式的限制如下:

  1. 所有的输入数字皆为正整数(包括0)
  2. 仅支持四则运算(+-*/)和括号
  3. 结果为整数或分数,分数必须化为最简格式(比如6,3/4,7/8,90/7)
  4. 除数可能为0,如果遇到这种情况,直接输出"ERROR"
  5. 输入和最终计算结果中的数字都不会超出整型范围

用例输入一定合法,不会出现括号匹配的情况

输入描述

字符串格式的表达式,仅支持+-*/,数字可能超过两位,可能带有空格,没有负数

长度小于200个字符

输出描述

表达式结果,以最简格式表达

  • 如果结果为整数,那么直接输出整数
  • 如果结果为负数,那么分子分母不可再约分,可以为假分数,不可表达为带分数
  • 结果可能是负数,符号放在前面

用例

输入 1 + 5 * 7 / 8
输出 43/8
说明
输入 1 / (0 - 5)
输出 -1/5
说明 符号需要提到最前面
输入 1 * (3*4/(8-(7+0)))
输出 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四种语言的解法。

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务