前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >逻辑题 | 鬼谷子数学问题

逻辑题 | 鬼谷子数学问题

作者头像
Amadeus
发布2023-02-28 15:58:02
5680
发布2023-02-28 15:58:02
举报
文章被收录于专栏:linux技术

原题如下

鬼谷子随意从2-99中选取了两个数。他把这两个数的和告诉了庞涓, 把这两个数的乘积告诉了孙膑。但孙膑和庞涓彼此不知道对方得到的数。第二天, 庞涓很有自信的对孙膑说:虽然我不知道这两个数是什么,但我知道你一定也不知道。随后,孙膑说:那我知道了。庞涓说:那我也知道了。这两个数是什么?

代码示例

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
第一步
庞告诉孙,已知和Sum满足有至少两种ab组合,且任意一组ab的乘积Pro都满足至少有两种ab组合,通过isPang函数将可能的ab组合放入abList_1
第二步
孙告诉庞,abList_1中的ab组合乘积得pro,该pro满足至少有两种ab组合,且所有的ab组合有且仅有一组ab组合满足isPang函数,通过isSun函数将abList中满足条件的ab组合放入abList_2,ab组合的积放入proList
第三步
庞告诉孙,abList_2中的ab组合相加得Sum,该Sum满足至少有两种ab组合,且所有的ab组合有且仅有一组ab所得乘积pro在proList中,将满足条件的ab组合放入abList,即最终答案
'''

# 根据给出的sum,遍历所有可能的a和b的组合
def getCombinationSum(sum):
    combination = []
    for a in range(2, 100):
        for b in range(2, 100):
            if a + b == sum and a <= b:
                combination.append((a, b))
    return combination


# 根据给出的pro,遍历所有可能的a和b的组合
def getCombinationPro(pro):
    combination = []
    for a in range(2, 100):
        for b in range(2, 100):
            if a * b == pro and a <= b:
                combination.append((a, b))
    return combination


def isPang(sum):
    '''
    第一步,传入的sum满足以下条件返回True,否则False:
    1. 可以拆分成若干组ab的加和
    2. 每一组拆分出来的ab乘积运算得pro,该pro满足有至少两组ab的乘积
    '''
    if len(getCombinationSum(sum)) < 2:
        return False
    else:
        combinationSum = getCombinationSum(sum)
        for i in combinationSum:
            status = 0
            pro = i[0] * i[1]
            # 有其中一组ab不满足就打断循环
            if len(getCombinationPro(pro)) < 2:
                status = 1
                break
    if status == 0:
        return True
    else:
        return False


def isSun(pro):
    '''
    第二步,传入的pro满足以下条件返回一组ab组合(元组),否则False
    1. 可以拆分成若干组ab的乘积
    2. 每一组拆分出来的ab相加运算得sum,所有ab加和的sum有且仅有一个满足第一步的条件(放入isPang函数后返回True)
    '''
    combination = []
    combinationPro = getCombinationPro(pro)
    if len(combinationPro) > 1:
        for i in combinationPro:
            sum = i[0] + i[1]
            if isPang(sum):
                combination.append(i)
    if len(combination) == 1:
        return combination
    else:
        return False


if __name__ == '__main__':

    # 第一步
    abList_1 = []
    for sum in range(4, 198+1):
        if isPang(sum):
            abList_1 += getCombinationSum(sum)

    # 第二步
    abList_2 = []
    proList = []
    for i in abList_1:
        pro = i[0] * i[1]
        if isSun(pro):
            abList_2.append(i)
            proList.append(pro)

    # 第三步
    abList = []
    for i in abList_2:
        sum = i[0] + i[1]
        n = 0
        for j in getCombinationSum(sum):
            if j[0] * j[1] in proList:
                n += 1
        if n == 1:
            abList.append(i)
    print(abList)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档