离散数学实验一

1. 已知命题p和q的真值,求这两个命题的合取、析取、异或、蕴含及等价命题的真值.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2020/9/18 09:33
# @Author  : Albert Darren
# @File    : 离散数学实验一.py
# @Software: PyCharm
# 实验1
def experiment1(loop_count=4):
    truth_value = [0, 1]
    while loop_count > 0:
        # 请求用户输入
        p_value = eval(input('请输入命题p的真值(1或者0):'))
        q_value = eval(input('请输入命题q的真值(1或者0):'))
        if p_value not in truth_value or q_value not in truth_value:
            print('您的输入不合法,请重新输入')
        else:
            print('逻辑运算结果'.center(20, '-'))
            print('p{}q的真值为:{}'.format(chr(ord('\u2227')), p_value & q_value))
            print('p{}q的真值为:{}'.format(chr(ord('\u2228')), p_value | q_value))
            print('p{}q的真值为:{}'.format('^', p_value ^ q_value))
            print('p{}q的真值为:{}'.format(chr(ord('\u2192')), int(not p_value or q_value)))
            print('p等价于q的真值为:{}'.format(int(p_value == q_value)))
            print('-' * 20)
        loop_count -= 1

2. 输出以下命题公式的真值表、主析取范式和主合取范式

命题公式

def experiment2():
    """
    输出命题公式:(p∨q)→r的真值表,主析取范式,主合取范式
    """
    truth_value = [0, 1]
    # 主析取范式
    dnf = []
    # 主合取范式
    cnf = []
    # 打印表头
    print('真值表'.center(20, '-'))
    print(' {} {} {} | {:^7} | {}'.format('p', 'q', 'r', '(p \u2228 q)', '(p \u2228 q) \u2192 r'))
    for p in truth_value:
        for q in truth_value:
            for r in truth_value:
                print(' {} {} {} | {:^7} | {:^12}'.format(p, q, r, (p | q), int(not (p | q) or r)))
                decimal_index = int(str(p) + str(q) + str(r), 2)
                if not (p | q) or r:
                    dnf.append('m' + str(decimal_index))
                else:
                    cnf.append('M' + str(decimal_index))
    print('主合取范式:' + '\u2227'.join(cnf))
    print('主析取范式:' + '\u2228'.join(dnf))

3. 计算与探索(选做):找出一些这样的正整数:它可以用两种不同的方式写成两个正整数的立方和,例如

def experiment3(start: int, stop: int):
    # 存放满足要求的整数
    num_set = []
    # 取出寻找范围内的每一个正整数
    for number in range(start, stop + 1):
        min_num = 1
        max_num = int(pow(number, 1 / 3))
        # 取出第一个数
        count = 0
        for first_num in range(min_num, max_num + 1):
            # 取出第二个数
            for second_num in range(min_num, max_num):
                if number == pow(first_num, 3) + pow(second_num, 3):
                    # print('{}={}^3+{}^3'.format(number, first_num, second_num))
                    count += 1
                    if count == 2:
                        num_set.append(number)

    return num_set

4.测试

if __name__ == '__main__':
    # double_cube_int()
    # 执行效率:35.3 ms ± 8.63 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    print(experiment3(10, 1000))
    #  执行结果:[559, 855]
    #  执行效率:55.9 ms ± 2.23 ms per loop((mean ± std. dev. of 7 runs, 10 loops each)
    # experiment2()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值