表达式求值是一个经典问题。在这个问题中,您只需要计算长度小于10^510的表达式
5
. 它只包含非负整数(可能有前导零),' +'s, ' -'s和' *',也就是说,它满足以下语法:
<expression>:= <term>|<expression>+<term>|<expression>-<term>
<term>:= <number>|<term>*<number>
<number>:= <digit>|<number><digit>
<digit>:= 0|1|2|3|4|5|6|7|8|9
例如:013,0213 -2132*0213是有效的,但-2132和32113+-3213是无效的。
评估的结果可能太大或负面。输出2^{32}2模的结果
32
避免溢出,因为您将使用3232位计算机。
3232位的机器包含2^{10}2
10
记忆单位,表示为r[0]r[0], r[1]r[1], \cdots⋯,r[2^{10}-1]r[2
10
−1]。每个单元是3232位无符号数,也是一条指令。
在每个循环中,令pc=r[0]\bmod 2^{10}pc=r[0]mod2
10
,机器执行指令r[pc]r[pc]。
让r (pc) = a2 ^ {30} + b2 ^ {20} + c2 ^ {10} + (pc)博士= a2
30.
+ b2
20.
+ c2
10
+d,其中aa、bb、cc、dd为非负整数,且小于2^{10}2
10
:
如果a=0a=0,机器输出r[b]r[b]的值并停止。
如果a=1a=1,则:
—如果input中没有剩余字符,设置r[0]r[0]为r[d]r[d];
—否则,将r[b]r[b]设置为输入的下一个字符的ASCII码,将r[0]r[0]设置为r[c]r[c]。
如果= 2 = 2,r [b] [b] (r [b] + [c]) \ bmod 2 ^ {32} (r [b] + [c]) mod2
32
,则将r[0]r[0]设置为r[d]r[d]。
如果a=3a=3,则:
—如果r[b]=0r[b]=0,设置r[0]r[0]为r[c]r[c]的值;
—否则,请将r[0]r[0]设置为r[d]r[d]的值。
注意,如果在某些指令中b=0b=0, r[0]r[0]可以被设置多次。它的值是循环后最后一次设置的值。
您需要设置每个单元的初始值,使机器能够在有限周期内停止,并输出以2^{32}2为模的表达式的结果
32
.
因为每个问题都有时间限制。在这个问题中,机器最多可以执行10^810
8
周期。