很简单但困扰我很久的问题: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就是跑不出来,到底是哪里错了呢?

讨论数量: 7

file

1/10 = 0.1

1/15 = 0.06666666666666667

1/6 = 0.16666666666666666

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

8个月前 评论

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

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
8个月前 评论

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

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

改成整數的比對, (a + b) * 6 == a * b 就不會出現誤差問題了 !

solutions = []

for a in range(6, 100):
    for b in  range(a, 100):
        if (a + b) * 6 == a * b:
            solutions.append((a, b))

width = len(str(max(map(max, solutions))))

for a, b in solutions:
    print(f"a = {a:{width}}, b = {b:{width}}")
a =  7, b = 42
a =  8, b = 24
a =  9, b = 18
a = 10, b = 15
a = 12, b = 12
6个月前 评论

精度问题,可以使用decimal

5个月前 评论

精度问题 可以使用from fractions import Fraction file

file

5个月前 评论

浮点数精度问题 solutions = []

for a in range(6, 100): for b in range(a, 100):

    # 使用 abs 函数和一个小的误差范围来比较两个浮点数
    if abs(1/a + 1/b - 1/6) < 1e-6:
        solutions.append((a, b))

for solution in solutions: print(f"a = {solution[0]}, b = {solution[1]}")

5个月前 评论

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