很简单但困扰我很久的问题:1/a+1/b=1/6,五个答案,为什么只有跑出四个?到底哪里错了?

初始化一个列表来存储解

solutions = []

遍历可能的 a 和 b 的值

for a in range(6, 100): # 从 6 开始遍历

for b in range(a, 100): # b 从 a 开始,因为 a 和 b 是无序的,且我们不想重复计算

if 1/a + 1/b == 1/6:

        solutions.append((a, b))  

打印所有解

for solution in solutions:

print(f”a = {solution[0]}, b = {solution[1]}”)

#解1、a=7,b=42;解2、a=8,b=24;解3、a=9,b=18;解4、a=10,b=15;解5、a=12,b=12。解4就是跑不出来,到底是哪里错了呢?

讨论数量: 3

file

1/10 = 0.1

1/15 = 0.06666666666666667

1/6 = 0.16666666666666666

精度问题吧,经常会出现这样的问题。

1个月前 评论

楼主使用下面的方法,避免计算过程中出现浮点数运算, 就能得到你期望的解。

def lcm(x, y):
    """
    计算两个数的最小公倍数
    """
    return abs(x*y) // math.gcd(x, y)


def lcm_of_three(x, y, z):
    """
    计算三个数的最小公倍数
    """
    # 首先计算a和b的最小公倍数
    lcm_xy = lcm(x, y)
    # 然后将结果与c计算最小公倍数
    return lcm(lcm_xy, z)


if __name__ == "__main__":
    solutions = []
    c = 6
    for a in range(6, 100):
        for b in range(a, 100):
            # 求三个数的最小公倍数作为分母
            lcm_int = lcm_of_three(a, b, c)
            # 如果分母相同的情况下, 分子之和相等。 那么 a b 则为解
            if lcm_int / a + lcm_int / b == lcm_int / c:
                solutions.append((a, b))

    for solution in solutions:
        print(solution[0], solution[1])
7 42
8 24
9 18
10 15
12 12
1个月前 评论

看到你这个问题挺有意思,我就尝试着回答一下。

  1. 首先浮点数缺省涉及到精读问题,前面两位也回答了。更具体的原因是计算机用二进制表示十进制引起的。
  2. 如何解决?前面的朋友也给出了方法,但比较复杂,其实Python内置有Fraction类,专门处理分数使用的。具体如下: from fractions import Fraction print(Fraction(1, 10) + Fraction(1, 15) == Fraction(1, 6)) 这样结果是True的。
5天前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!