【发布时间】:2012-07-01 04:41:51
【问题描述】:
现在我正在尝试解决Project Euler 71。
考虑分数 n/d,其中 n 和 d 是正整数。如果 n
如果我们按升序列出 d ≤ 8 的约简真分数集 大小顺序,我们得到:
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
可以看出,2/5 是紧靠左边的分数 3/7。
通过列出 d ≤ 1,000,000 在 大小的升序,找到分数的分子 紧挨着 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 的稍大表示(稍后将转换为分数)。
x = Fraction(3,7)
best = Fraction(0)
x 只是对Fraction(3,7) 的快速参考,所以我不必继续输入它。 best 用于跟踪最接近 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 减去best 或y(等于我们需要检查的分数)是否更接近0。更接近零的那个将是最左边,或最接近3/7。
d -= 1
n = int(math.ceil(d*0.428572))
无论最好的改变与否,分母都需要改变。因此,从分母中减去 1 并将 n 的 Fraction(n,d) 设置为比 3/7 稍大(添加了额外的 ceil 方法以确保它更大!)以修剪测试空间。
print(best.denominator)
最后打印出问题想要的内容。
注意
将d 更改为8 和n 更改为4(如测试用例)给出了5 作为分母的期望结果。保持原样给出:999997.
有人可以向我解释我做错了什么吗?
【问题讨论】:
-
投反对票有什么理由吗?
-
并非如此。这是一个结构良好的问题。得到一些补偿。
标签: python python-3.x