鬼谷子猜数的Python实现

1 问题

 一天,鬼谷子随意从2-99中选取了两个数。他把这两个数的和告诉了庞涓, 把这两个数的乘积告诉了孙膑。但孙膑和庞涓彼此不知到对方得到的数。

    第二天, 庞涓很有自信的对孙膑说:虽然我不知到这两个数是什么,但我知道你一定也不知道。

    随后,孙膑说:那我知道了。

    庞涓说:那我也知道了。这两个数是什么?

2. 前提与假设

    1. 前提:两个素数的乘积,不能拆分成其他形式的乘积(除了1x数字本身),而得到同一个数。

    2. 两个数为A,B,且A≠B

    3. 和为S

    4. 乘积为P

3. Python代码

from collections import defaultdict

# 使用代码生成results
def is_prime(n):
    """判断一个数是否为素数"""
    if n <= 1:
        return False
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True

results = []
for num in range(3, 99, 2):
    if not is_prime(num):
        results.append(2 + num)
        
print("庞涓手中的合数可能是:\n")
print(results)

def filter_unique_second_column(arr,n):
    
    # 计算第n列每个值的出现次数
    value_counts = {}
    for row in arr:
        second_value = row[n]
        if second_value in value_counts:
            value_counts[second_value] += 1
        else:
            value_counts[second_value] = 1
    
    # 筛选出第n列值只出现过一次的行
    unique_rows = [row for row in arr if value_counts[row[n]] == 1]
    
    return unique_rows
def find_combinations(results):
    """找到所有可能的A*B组合及其累计计数,并记录A和B的值,最后按乘积正向排序"""
    result_array = []

    # 遍历结果集
    for result in results:
        for A in range(2, int(result/2) + 1, 1):  # 确保A为偶数且步长为2以减少迭代次数
            B = result - A
            if B > A:  # 确保A < B且都是偶数
                product = A * B
                result_array.append([A, B, product])
    
    # 只保留product数值唯一的行,保证result_array每一行的product数值不与其他任何一行的product数值相同,如果有相同的多行,则删除所有重复的行
    result_array = filter_unique_second_column(result_array,-1)

    # 如果需要按乘积排序并去重,请在完成所有计算后再进行
    result_array.sort(key=lambda x: x[-1])  # 按乘积正向排序
    
    return result_array


print("")
print("而根据可能的合数,计算出可能的组合数和孙膑手中的乘积数值分别为:\n")
# 调用find_combinations函数并打印结果
combinations1 = find_combinations(results)
combinations1.sort(key=lambda x: x[-1],reverse=True) 
for item in combinations1:
    print(item)
    
print("")  
print("根据两个组合数推理:只有一种乘数结果的,且只有一种合数方法的,只有:\n")
# 遍历combinations,添加一列,数值为A+B,按照和的从小到大进行排序
# 假设combinations已经是包含[product, count, A, B]格式的列表l
# 为每项添加一列A+B的和
for item in combinations1:
    item.append(item[0] + item[1])  # 添加A+B的和到每行的末尾


# 根据A+B的和进行降序排序
combinations1.sort(key=lambda x: x[-1],reverse=True)  # 使用列表的最后一个元素(即A+B的和)作为排序依据

combinations1 = filter_unique_second_column(combinations1,-1)
# 打印排序后的结果,展示包括A+B和在内的所有信息
for item in combinations1:
    print(f"    A: {item[0]}, B: {item[1]}, A+B: {item[-1]}, A*B: {item[2]} ")
    

    


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值