我对Project Euler 71的逻辑有什么问题?

现在我正试图解决
Project Euler 71.

Consider the fraction, n/d, where n and d are positive integers. If
n

If we list the set of reduced proper fractions for d ≤ 8 in ascending
order of size, we get:

1/8, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 3/8, 2/5, 3/7, 1/2, 4/7, 3/5, 5/8,
2/3, 5/7, 3/4, 4/5, 5/6, 6/7, 7/8

It can be seen that 2/5 is the fraction immediately to the left of
3/7.

By listing the set of reduced proper fractions for d ≤ 1,000,000 in
ascending order of size, find the numerator of the fraction
immediately to the left of 3/7.

现行守则:

from fractions import Fraction
import math

n = 428572
d = 1000000

x = Fraction(3,7)

best = Fraction(0)

while d > 1:
    if Fraction(n,d) >= x:
        n-=1
    else:
        y = Fraction(n,d)
        if (x - y) < (x - best):
            best = y
        d -= 1
        n = int(math.ceil(d*0.428572))

print(best.denominator)

说明:

from fractions import Fraction
import math

分数和math.ceil需要.

n = 428572
d = 1000000

这两个变量代表原始问题中陈述的n和d.数字以这种方式开始,因为这是3/7的略大表示(稍后将转换为Fraction).

x = Fraction(3,7)

best = Fraction(0)

x只是对Fraction(3,7)的快速参考,所以我不必继续输入它.最好用于跟踪哪个分数最接近3/7但仍然离开它.

while d > 1:

如果d <= 1且n必须小于1,那么检查点是什么?然后停止检查.

if Fraction(n,d) >= x:
    n-=1

如果分数最终大于或等于3/7,则不在它的左边,所以保持从n减去直到它在3/7的左边.

    else:
        y = Fraction(n,d)
        if (x - y) < (x - best):
        best = y

如果它在3/7的左边,看看3/7减去最佳值还是y(等于我们需要检查的分数)接近于0.接近零的那个将是最左边的,或者最接近于3/7.

        d -= 1
        n = int(math.ceil(d*0.428572))

无论是否有最佳变化,分母都需要改变.因此,从分母中减去一个,并将分数(n,d)稍微大一些(添加额外的ceil方法以确保它更大!),而不是3/7来修剪测试空间.

print(best.denominator)

最后打印出问题的内容.

注意

将d更改为8,将n更改为4(与测试用例一样),为分母提供所需的结果5.保持原样:999997.

有人可以向我解释我做错了什么吗?

最佳答案 你做错了什么:

find the numerator

除此之外,请按照@ Antimony的建议,了解Stern-Brocot树,这是有用和有趣的.

点赞