【算法题】火星文计算

  • A+
所属分类:编程茶楼


共计 1343 个字符,预计需要花费 4 分钟才能阅读完成。

已知火星人使用的运算符为#、$,其与地球人的等价公式如下:
x#y = 2x+3y+4
x$y = 3*x+y+2
1、其中x、y是无符号整数
2、地球人公式按C语言规则计算
3、火星人公式中,$的优先级高于#,相同的运算符,按从左到右的顺序计算
现有一段火星人的字符串报文,请你来翻译并计算结果

输入描述:
火星人字符串表达式(结尾不带回车换行)
输入的字符串说明: 字符串为仅由无符号整数和操作符(#、$)组成的计算表达式。例如:123#4$5#67$78。
用例保证字符串中,操作数操作符之间没有任何分隔符。
用例保证操作数取值范围为32位无符号整数。
保证输入以及计算结果不会出现整型溢出。
保证输入的字符串为合法的求值报文,例如:123#4$5#67$78
保证不会出现非法的求值报文,例如类似这样字符串: *

#4$5 //缺少操作数

4$5# //缺少操作数

4#$5 //缺少操作数

4 $5 //有空格

3+4-5*6/7 //有其它操作符

12345678987654321$54321 //32位整数计算溢出

输出描述:
根据输入的火星人字符串输出计算结果(结尾不带回车换行)

示例1

输入
7#6$5#12
输出
226

示例:

7#6$5#12  
=7#(3*6+5+2)#12  
=7#25#12  
=(2*7+3*25+4)#12  
=93#12  
=2*93+3*12+4  
=226
import java.util.Scanner;

/**
 * @since 2022年4月22日
 */
public class MartianText {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine();

        String[] arr_jin = line.split("#");

        int sum = dealWithArr_jin(arr_jin[0]);
        for (int i = 1; i < arr_jin.length; i++) {
            sum = calculate_jin(sum, dealWithArr_jin(arr_jin[i]));
        }

        System.out.print(sum); // 注意!!!不带回车
    }

    private static Integer dealWithArr_jin(String arr_jin) {
        String[] arr_dollar = arr_jin.split("\\$");
        if (arr_dollar.length < 2) {
            return Integer.parseInt(arr_jin);
        }
        int temp = Integer.parseInt(arr_dollar[0]);
        for (int j = 1; j < arr_dollar.length; j++) {
            temp = calculate_dollar(temp, Integer.parseInt(arr_dollar[j]));
        }
        return temp;
    }

    private static int calculate_dollar(int x, int y) {
        return 3 * x + y + 2;
    }

    private static int calculate_jin(int x, int y) {
        return 2 * x + 3 * y + 4;
    }
}
  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: