【算法题】火星文计算

236次阅读
没有评论

共计 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;
    }
}
正文完
 
裴先生
版权声明:本站原创文章,由 裴先生 2022-04-22发表,共计1343字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
本站勉强运行: