320
社区成员




使一个布尔表达式的值为零的取值组合称为该表达式的一个布尔零点。
比如,布尔表达式A+B+C就只有一个零点,就是(A,B,C)的取值组合(0,0,0)。而布尔表达式A*B*C就有不止一个零点,(A,B,C)的取值组合为(0,0,1)或(1,1,0)都是它的零点。其中A、B、C都是布尔变量,而布尔变量只能取值0或1。
布尔表达式可以把布尔变量去掉而只保留运算符,称为布尔表达式的简写。如:+*(+)就是布尔表达式A*(B+C)的简写。
现在用|表示或运算,它有如下的真值表:
0|0=0
0|1=1
1|0=1
1|1=1
布尔表达式的优先级是:乘法运算优先于加法运算和或运算,但小括号可以改变优先级为“小括号中的内容优先”。
现给出只包含乘法运算和或运算的布尔表达式的简写,求表达式的零点计数。
嗯,问哥说了,这个题目,专门坑非C选手。
因为还没考试该题,解答也先不放,然后放一个数字出来,懂得都懂。4294967296。
之前公布的这个数字,相信小伙伴们都知道这个数字是 2 * * 32,也就是整型范围,那么问题来了,如果结果超出这个范围会怎样呢?
import re
s = input()
def p(s):
r = [1,0]
sp = [[eval(x) if len(x) > 0 else (1,1) for x in v.split('*')] for v in s.split('|')]
for i,v1 in enumerate(sp):
v = v1[0]
for j in range(1,len(v1)):
z = v1[j]
v = (v[0] * 2 ** z[1] + z[0] * 2 ** v[1] - v[0] * z[0],v[1] + z[1])
r = [r[0] * v[0],r[1] + v[1]]
return str(r)
def y(m):
return p(m.group(1))
def x(s):
while re.search(r'\(([^\(\)]+)\)',s):
s = re.sub(r'\(([^\(\)]+)\)',y,s)
s = p(s)
return eval(s)
print(x(s)[0] % 2 ** 32)