项目欧拉#45:我的逻辑错误怎么样?

时间:2012-01-31 11:18:27

标签: python

来自Project Euler,问题45:

Triangle, pentagonal, and hexagonal numbers are generated by the following formulae:

Triangle T_(n)=n(n+1)/2 1, 3, 6, 10, 15, ...

Pentagonal P_(n)=n(3n−1)/2 1, 5, 12, 22, 35, ...

Hexagonal H_(n)=n(2n−1) 1, 6, 15, 28, 45, ...

It can be verified that T_(285) = P_(165) = H_(143) = 40755.

Find the next triangle number that is also pentagonal and hexagonal.

[http://projecteuler.net/problem=45]

现在要解决这些问题,我拿了三个变量并将方程式等同于A.

n(n + 1)/2 = a(3a - 1)/2 = b(2b - 1) = A

A =三个函数对于n,a,b

的值重合的数字

结果我们得到3个带有n和A的方程。用quarditic公式求解,我们得到3个方程。

 (-1 + sqrt(1 + 8*A ) )/2
 ( 1 + sqrt(1 + 24*A) )/6
 ( 1 + sqrt(1 + 8*A ) )/4

所以我的逻辑是测试A的值,其中三个等式给出自然+ ve值。到目前为止,它的数量正确 40755 ,但未能找到下一个高达1000万的数据。

(编辑):这是我在python中的代码

from math import *

i=10000000
while(1):
    i = i + 1
    if(((-1+sqrt(1+8*i))/2).is_integer()):
        if(((1+sqrt(1+24*i))/6).is_integer()):
            if(((1+sqrt(1+8*i))/4).is_integer()):
                print i
                break

我的逻辑怎么错? (对于涉及的一些数学道歉。)

3 个答案:

答案 0 :(得分:3)

鉴于:

  • 所有六角形也是三角形
  • heapq.merge对于手头的任务非常方便(高效且节省代码)

然后这个:

import heapq

def hexagonals():
    "Simplified generation of hexagonals"
    n= 1
    dn= 5
    while 1:
        yield n
        n+= dn
        dn+= 4

def pentagonals():
    n= 1
    dn= 4
    while 1:
        yield n
        n+= dn
        dn+= 3

def main():
    last_n= 0
    for n in heapq.merge(hexagonals(), pentagonals()):
        if n == last_n:
            print n
        last_n= n

main()

产生1,40755和你几乎没有时间寻找的另一个数字,几秒钟后产生一个14位数字。当你认为燃烧的电量足够时,就停止计划。

如果您想避免“不透明”库,请使用以下main(基本上相同的算法,仅拼写出来):

def main():
    hexagonal= hexagonals()
    pentagonal= pentagonals()
    h= next(hexagonal)
    p= next(pentagonal)
    while 1:
        while p < h:
            p= next(pentagonal)
        if p == h:
            print p
        h= next(hexagonal)

时代看起来很相似,但我没有费心去做基准测试。

答案 1 :(得分:0)

你的逻辑没有错,你的程序运行需要很长时间(根据我的估计,它应该在大约一个小时内提供答案)。我知道答案并通过将i设置为低于它的值来测试您的程序。然后你的程序立即弹出正确的答案。

听从ypercube的建议。

答案 2 :(得分:0)

最简单的实现方法是为每个序列生成3个生成器并在

中路由它们

heapq.merge

然后如果你找到3个相同的连续键,你就得到了解决方案 找到这个的最简单方法是usnig

itertools.groupby