2012-11-04 38 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

相關問題