华为OD-火星文计算
华为OD-火星文计算

题目描述

已知火星人使用的运算符号为 # 、 $

他们与地球人的等价公式如下:

  • x#y=4*x+3*y+2
  • x$y=2*x+y+3

其中 x y 是无符号整数

地球人公式按照 C 语言规则进行计算

火星人公式中 # 符优先级高于 $

相同的运算符按从左到右的顺序运算

输入描述

火星人字符串表达式结尾不带回车换行

字符串为仅有无符号整数和操作符组成的计算表达式

  1. 用例保证字符串中操作数与操作符之间没有任何分隔符
  2. 用例保证操作数取值范围为 32 位无符号整数
  3. 保证输入以及计算结果不会出现整型溢出
  4. 保证输入的字符串为合法的求值报文 例如: 123#4$5#76$78
  5. 保证不会出现非法的求值报文

例如:

  • #4$5 这种缺少操作数;
  • 4$5# 这种缺少操作数;
  • 4#$5 这种缺少操作数;
  • 4 $5 有空格;
  • 3+4-5*6/7 有其他操作符;
  • 12345678987654321$54321 32 位整数溢出

输出描述

根据火星人字符串输出计算结果 结尾不带回车换行

示例一

华为Od机试,火星文计算实例一
华为Od机试,火星文计算示例一

核心知识点

  1. 使用正则表达式将输入字符串分为两个列表:数字列表和操作符列表。
  2. 使用 while 循环实现对 “#” 操作符的计算。
  3. 调用 sharp 和 dollar 函数对数字进行运算,并得到最终结果。
  4. 将最终结果通过 print 语句输出。

Python实现

import re

def solve_method(input):
    operators = re.findall(r'\W+', input)
    nums = list(map(int, re.findall(r'\d+', input)))
    pos_s = operators.index("#")
    while pos_s != -1:
        tmp = f1(nums[pos_s], nums[pos_s + 1])
        nums[pos_s] = tmp
        nums.pop(pos_s + 1)
        operators.pop(pos_s)
        pos_s = operators.index("#") if "#" in operators else -1
    res = nums[0]
    for i in range(1, len(nums)):
        res = f2(res, nums[i])
    print(res)

def f1(x, y):
    return 4 * x + 3 * y + 2

def f2(x, y):
    return 2 * x + y + 3

input_str = input()
solve_method(input_str)

输出:

7#6$5#12
157

最后修改日期: 2023年3月22日