(每日一练)题目名称:布尔零点计数

文盲老顾
WEB应用领新星创作者
博客专家认证
2023-06-20 15:02:45

使一个布尔表达式的值为零的取值组合称为该表达式的一个布尔零点。
比如,布尔表达式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选手。

img

因为还没考试该题,解答也先不放,然后放一个数字出来,懂得都懂。4294967296。

...全文
244 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
文盲老顾 2023-06-22
  • 打赏
  • 举报
回复

之前公布的这个数字,相信小伙伴们都知道这个数字是 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)

320

社区成员

发帖
与我相关
我的任务
社区描述
主要用于技术交流,包括但不限于 .net,mssql,js,css,python,算法,运维。也可以晒最新技术,美图,运动等。最后,如果有问题,可以提问,老顾能帮忙的会尽量帮忙哦。
前端sqlserverasp.net 技术论坛(原bbs) 北京·西城区
社区管理员
  • 文盲老顾
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧