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]} ")