You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何过滤a³+b³=c³+d³计算中元素相同顺序不同的重复解

解决方案

你遇到的重复问题本质是遍历逻辑没有限制排列顺序,导致同一个解的所有排列都会被记录,有两种常用的解决思路:

方法一:遍历阶段限制范围(推荐,效率更高)

从根源避免生成重复解,同时可以优化掉无意义的四重循环,代码如下:

interval = list(range(1, 16))
cube_sum_map = {}
solutions = []

# 预存所有满足 a<=b 的数对对应的立方和
for a in interval:
    for b in interval:
        if a > b:
            continue
        s = a ** 3 + b ** 3
        cube_sum_map.setdefault(s, []).append((a, b))

# 提取同一立方和下的不同数对组合,避免反向重复
for s, pairs in cube_sum_map.items():
    if len(pairs) < 2:
        continue
    for i in range(len(pairs)):
        for j in range(i + 1, len(pairs)):
            p1, p2 = pairs[i], pairs[j]
            solutions.append([p1[0], p1[1], p2[0], p2[1]])

print(solutions)

运行后输出为 [[1, 12, 9, 10]],就是你需要的唯一解。

方法二:生成结果后标准化去重

如果你不想修改原有遍历逻辑,可以对已经生成的结果做标准化处理去重,代码如下:

# 保留你原有生成solutions的代码不变,新增以下去重逻辑
unique_set = set()
for sol in solutions:
    # 对两个数对分别排序,再整体排序得到唯一的标准化形式
    pair1 = tuple(sorted([sol[0], sol[1]]))
    pair2 = tuple(sorted([sol[2], sol[3]]))
    standard_form = tuple(sorted([pair1, pair2]))
    unique_set.add(standard_form)

# 转换为列表格式输出
unique_solutions = [list(p1 + p2) for p1, p2 in unique_set]
print(unique_solutions)

原理说明

  • 方法一通过a<=b的限制避免了同一两数组合出现正反两种排列,取数对时要求i<j避免了两个数对互换位置的重复,既减少了无效遍历,又直接得到唯一解,区间范围越大效率优势越明显。
  • 方法二的核心是对每个四元组做标准化处理,不管四个数怎么排列,最终得到的标准化形式完全一致,利用集合的去重特性直接过滤重复结果。

内容的提问来源于stack exchange,提问作者user17156350

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:06:03