【问题标题】:What is wrong with my logic for Project Euler 71?我对 Project Euler 71 的逻辑有什么问题?
【发布时间】: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

这两个变量代表了原问题中所说的nd。这些数字以这种方式开始,因为这是3/7 的稍大表示(稍后将转换为分数)。

x = Fraction(3,7)

best = Fraction(0)

x 只是对Fraction(3,7) 的快速参考,所以我不必继续输入它。 best 用于跟踪最接近 3/7 但仍位于其左侧的分数。

while d > 1:

如果d &lt;= 1n 必须小于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 减去besty(等于我们需要检查的分数)是否更接近0。更接近零的那个将是最左边,或最接近3/7

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

无论最好的改变与否,分母都需要改变。因此,从分母中减去 1 并将 n 的 Fraction(n,d) 设置为比 3/7 稍大(添加了额外的 ceil 方法以确保它更大!)以修剪测试空间。

print(best.denominator)

最后打印出问题想要的内容。

注意

d 更改为8n 更改为4(如测试用例)给出了5 作为分母的期望结果。保持原样给出:999997.

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

【问题讨论】:

  • 投反对票有什么理由吗?
  • 并非如此。这是一个结构良好的问题。得到一些补偿。

标签: python python-3.x


【解决方案1】:

这不是正确的做事方式。你应该使用the Stern-Brocot tree。您根本不必纠结浮点数。

【讨论】:

  • 感谢您的中肯建议。
【解决方案2】:

你做错了什么:

找到分子

除此之外,听从@Antimony 的建议,了解 Stern-Brocot 树,这既有用又有趣。

【讨论】:

    【解决方案3】:

    不要让你觉得自己很愚蠢。但是你的答案完全正确,再读一遍问题,把最后一行改成:

    print( best.numerator )
    

    此外,为了记录,还有一种非常更有效的计算方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      • 2020-03-17
      • 1970-01-01
      相关资源
      最近更新 更多