解题思路
本题是自定义词法分析 + 从左到右求值 + 结果钳制 + 按字节取反的综合实现题。
- 合法性:先检查字符集(仅字母数字与
+/-)、长度 ≤104,再用有限状态机式地扫描「数 + 运算符 + 数 + …」结构;- 仅可作为二元运算符,不能引出负数字面。
- 读数:
0x/0X 后读十六进制,数值 ≤999;
0o/0O 后读八进制(仅 0-7),数值 ≤999;
- 否则按十进制读连续数字(允许前导零),数值 ≤999。
P14382.简单表达式运算(100分)
题目内容
给出一个由字母、数字和加减运算符组成的简单表达式,做如下处理:
1、对字符串进行解析,获取 8 进制( 0o 或 0O 开头)、10 进制、16 进制( 0x 或 0X 开头)整数和 +、− 运算符;
2、对解析结果,按照表达式的顺序从左到右进行运算,得到 10 进制整数结果;
3、把运算的整数结果调整到 −255~255 范围,如果值大于 255,则取值 255,如果值小于 −255,则取 −255;
4、把调整后的结果转换成十六进制并进行取反运算;
5、输出最终运算结果对应的字符串。
输入描述
string inputStr // 表达式
输出描述
string outputStr // 返回 "NA" 或者运算结果对应的字符串
注:
1、给定的 inputStr 是由字母、数字、+、− 组成的字符串,长度为 0~10000;
2、关于 inputStr 中解析的整数部分,表示进制的 x、o 以及数值部分的字母 a ~ f 支持大小写,支持前缀为 0 整数串,解析的整数值范围为 0~999,例如:
-
(1) "0xEF"、"0X0eF"、"0X00Ef"、"0X000EF"、"0x0000EF"、"0x00000ef"等解析的整数 16 进制值为 0xEF,10 进制值为 239;
-
(2) "89"、"089"、"0089"、"00089"、"000089"、"0000089"等解析的整数 10 进制值为 89;
-
(3) "0o77"、"0O077"、"0O0077"、"0O000077"、"0o0000077" 等解析的整数 8 进制值为 0o77,10 进制值为 63;
3、如果输入表达式合法,则输出最终十六进制运算结果对应的字符串;否则输出 NA,例如:包含非法字符、长度超出范围、表达式不合法、值超出范围、输入有负数等;
4、输出的十六进制字符串以 "0x" 为前缀,数值字符用大写,补齐两位,例如:"0x00"、"0x0B"、"0xC9"、"0x2E"、"0xDF"、"0x3A"。
补充说明:
1、程序运行内存要小于 256 MB;
2、程序运行耗时不能超过 1 秒。
样例1
输入
"023+0x21+0o13+1"
输出
"0xBB"
说明
计算结果为 68,转换 16 进制为 44,取反后 16 进制结果为 BB
样例2
输入
"0x0C-0o20+1"
输出
"0x02"
说明
计算结果为 $$-3$$,该负数的 16 进制补码值为 FFFFFFFD,取反后 16 进制值为 0x2
样例3
输入
"-1+5"
输出
"NA"
说明
非法表达式,不支持负数
样例4
输入
"2324+12-23"
输出
"NA"
说明
表达式中整数超过限定范围
样例5
输入
"123 + 12-13="
输出
"NA"
说明
表达式中存在非法的空白字符
样例6
输入
"3A+0xEGW-0o89"
输出
"NA"
说明
表达式不合法,10 进制、16 进制、8 进制的数都不正确
样例7
输入
"45-46"
输出
"0x00"
说明
计算结果为 −1,该负数的补码为 FFFFFFFF,取反后为 0
样例8
输入
"30+0xEc+0O12+9"
输出
"0x00"
说明
输出结果为 285,大于 255,取值 255,16 进制为 0xFF,取反后的 16 进制结果为 0x00