2012-11-04 22 views
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的需要多年才能做这些计算(我已经等了大约十分钟,它仍然打印号码)。如何解决这个问题的任何提示将非常感激。

p.s.主要观点是使用列表。此外,提示将比解决方案本身更受赞赏。

谢谢!

+0

那么,作为一个,你可以将第二个循环限制在x以下的数字。例如“8 ** 2 = 64”不能表示为大于“64”的任何数字的总和。 –

+0

你给了多少这样的数字? – inspectorG4dget

+0

我在想,但我不知道如何用Python编写。感谢提示:D – Dizzle

回答

2

怎么样一个列表理解? 计算在范围(1,1011)C 在范围b(1,C) 用于在范围(1,B)

如下:

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秒,在我的电脑上完成

7

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

+0

啊好吧。非常感谢:D,我想我已经破解了它! – Dizzle

+0

这基本上是找到Pythagrean三元组的问题。只需将'c'保存在'a ** 2 + b ** 2 = c ** 2'中即可。 – Droogans

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)] 

让我知道这对你的作品

+0

我试过了,它没有工作,试图做一些修改,但仍然没有。谢谢:) – Dizzle

+0

我跑了它,并获得了[1,1000] 567条目。如果您可以更具体地了解哪些方面无效,我可以尝试修复它 – inspectorG4dget

0

我只是answered this其他地方!

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 

几乎立即运行。

+0

我对您的实施速度印象深刻,但是您只能得到一个解决方案,因此您的最终名单小于满因为对于c = 25有两个解:(15,20,25)和(7,24,25),我的列表理解的len是881,因为它包含所有'唯一的解,其中a jcr

+1

OP的标题有点令人误解:*正方形是两个平方和的数字列表*与我读的数字:*其平方**为* *两个平方的总和* – Droogans

相关问题