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

已知x+y=z,如何计算x与y的最小公倍数?现有代码无法运行

求解满足x+y=z的整数x、y的最小公倍数问题

原代码的问题

原代码逻辑完全偏离需求,存在两个核心错误:

  • 只筛选了能整除z的x,忽略了大量其他可能的(x,y)组合,而这些组合的最小公倍数可能更小。比如z=8时,原代码会保留(1,7)、(2,6)、(4,4),但如果只看这些就会漏掉x=3、y=5(LCM=15),不过更关键的是——
  • 直接取元组列表的最小值是按字典序比较,和最小公倍数的大小无关。比如z=8时,原代码会输出(1,7),但它的LCM是7,而(4,4)的LCM是4,显然更小,这就导致结果错误。

正确解法思路

已知x + y = z,所以y = z - x。最小公倍数的计算公式是:

LCM(x, y) = (x × y) ÷ GCD(x, y)
根据欧几里得算法,GCD(x, y) = GCD(x, z)(因为GCD(x, z-x) = GCD(x, z)),所以LCM(x, z-x) = (x×(z-x)) ÷ GCD(x, z)

要找到最小的LCM,我们需要遍历所有可能的x(1 ≤ x < z),计算对应的LCM值,再从中取最小的那个。由于x和z-x的LCM是相同的,只需遍历到x ≤ z//2即可,能减少一半的计算量。

修正后的代码

import math

z = int(input())

# 初始化最小公倍数为无穷大,初始配对为(1, z-1)
min_lcm = float('inf')
best_pair = (1, z - 1)

# 遍历x从1到z//2,避免重复计算
for x in range(1, z // 2 + 1):
    y = z - x
    # 计算最大公约数
    gcd_val = math.gcd(x, y)
    # 计算当前最小公倍数
    current_lcm = x * y // gcd_val
    # 更新最小公倍数及对应配对
    if current_lcm < min_lcm:
        min_lcm = current_lcm
        best_pair = (x, y)

print(f"满足条件的x={best_pair[0]}, y={best_pair[1]},最小公倍数为{min_lcm}")

代码说明

  • 使用math.gcd快速计算两个数的最大公约数,该函数在Python3.5及以上版本可用,适用于正整数计算
  • 初始化时把最小公倍数设为无穷大,确保任何合法的LCM都能替换它
  • 遍历范围缩小到z//2,因为x和z-x的组合是对称的,不用重复计算
  • 每次计算当前x对应的LCM,若比记录的最小值更小,就更新最小值和对应的(x,y)对

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:45:41