惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
N
Netflix TechBlog - Medium
WordPress大学
WordPress大学
罗磊的独立博客
H
Help Net Security
MongoDB | Blog
MongoDB | Blog
A
About on SuperTechFans
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
D
Docker
云风的 BLOG
云风的 BLOG
Microsoft Security Blog
Microsoft Security Blog
Blog — PlanetScale
Blog — PlanetScale
P
Proofpoint News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
I
InfoQ
J
Java Code Geeks
博客园 - 聂微东
大猫的无限游戏
大猫的无限游戏
Engineering at Meta
Engineering at Meta
美团技术团队
小众软件
小众软件
Stack Overflow Blog
Stack Overflow Blog
C
Check Point Blog

lvbibir's Blog

shell | 磁盘空间分析脚本 Linux cat 和 tee 命令写入文件 python | 使用 uv 管理你的 python 环境 Claude Code 完整配置指南 windows | mihomo 内核独立部署指南 linux | 磁盘扩容 wsl | 释放长久运行占用的磁盘空间 mysql | 线程上限问题处理 麒麟 7.6 安装谷歌 OTP 认证模块 suse 12sp5 升级 openssh 及 openssl suse 12sp5 部署 mysql 5.7 《谁的青春不迷茫》 docker | centos7 部署 docker vim | 基础配置和使用 windows | rime 输入法 & 雾凇方案 shell | sshpass 批量传输文件及执行命令 wsl | 原生 linux 方式安装 docker nodejs | fnm + pnpm 开发环境配置 wsl | 安装配置 miniconda 虚拟环境 wsl | 自动更新系统代理 wsl | bashrc 环境变量不正确加载的处理方法 wsl | win10 安装 wsl2 troubleshooting | ssh 成功但是 scp 失败 linux | 常用命令总结 docker 部署 piclist shell | 检测网站存活并自动钉钉告警 Zabbix | 监控端口连通性并自动追踪 TCP 路由 windows | 自定义开机快速启动项 windows | miniconda 配置 python 虚拟环境 Zabbix | 监控主机到指定 ip 的流量大小
python | 鬼谷子数学问题
lvbibir · 2023-02-27 · via lvbibir's Blog

原题如下

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

代码示例

#!/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)

以上

wechat_pay

微信

alipay

支付宝