现在我正试图解决
Project Euler 71.
Consider the fraction, n/d, where n and d are positive integers. If
nIf 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/8It 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树,这是有用和有趣的.