7

我刚刚开始学习 Python 并开始做一些问题只是为了帮助培养我的技能,但是我非常坚持这个问题。

制作一个包含最多 1000 的所有正整数的列表,其平方可以表示为两个平方的和,(即整数 p 其中 p^2=m^2+n^2,其中 m 和 n 是整数大于 0。)

提示:有几种方法。您可能会发现拥有所有平方数的列表很有帮助。in 运算符可能很有用。

这是我到目前为止提出的代码:

    numbers=xrange(1001)
    numbers_squared=[x**2 for x in numbers]
    a=[]

    for x in numbers_squared:
        for b in numbers_squared:
            if (x+b)**.5 <= 1001:
                a.append(x+b)
    print a

我遇到的问题是 Python 需要数年时间来完成这些计算(我已经等了大约十分钟,它仍在打印数字)。任何有关如何解决此问题的提示将不胜感激。

ps 重点是使用列表。此外,提示将比解决方案本身更受欢迎。

谢谢你!

4

4 回答 4

7

首先,你没有解决问题。您需要进行检查以确保(x+b)**.5它实际上是一个整数。其次,如果您正在打印数字,您已经计算出所有数字。执行上述操作将减少此步骤所需的时间。

于 2012-11-04T03:00:22.687 回答
2

列表理解怎么样?计算范围 (1,1011) 中的 c 范围 (1, c) 中的 b 范围 (1, b) 中的 a

如下:

x = [(a,b,c) for c in range(1,1001) for b in range(1, c) for a in range(1,b) if a**2+b**2==c**2]
print x 

我已经计时了,在我的电脑上完成需要 46 秒

于 2012-11-04T09:29:08.397 回答
1

这可能有效:

def isSumOfSquares(n):
    """return True if n can be expressed as the sum of two squares; False otherwise"""

    for a in xrange(1,n):
        b = n-(a**2)
        if b<=0:
            return False
        elif not math.sqrt(b)%1:
            return True
    return False

answer = [i for i in xrange(1,1001) if isSumOfSquares(i**2)]

让我知道这是否适合您

于 2012-11-04T03:08:32.713 回答
0

我刚刚在别处回答了这个问题!

import math

def is_triple(hypotenuse):
    """return (a, b, c) if Pythagrean Triple, else None"""
    if hypotenuse < 4:
        return None

    c = hypotenuse ** 2

    for a in xrange(3, hypotenuse):
        b = math.sqrt(c - (a ** 2)) 
        if b == int(b):
            return a, int(b), hypotenuse

    return None

>>> results = [x for x in range(1001) if is_triple(x)]
>>> len(results)
567

几乎立即运行。

于 2012-11-04T20:58:55.783 回答