我刚刚开始学习Python并且已经开始做一些问题只是为了帮助提高我的技能,但是我非常坚持这个问题。
制作一个包含所有高达1000的正整数的列表,其正方形可以表示为两个正方形的和(i,例如,整数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 :(得分:7)
首先,你没有解决问题。您需要进行检查以确保(x+b)**.5
实际上是一个整数。
其次,如果您要打印数字,您已经计算出所有数字。执行上述操作将减少此步骤所需的时间。
答案 1 :(得分:2)
列表理解怎么样? 计算范围内的c(1,1011) 对于范围内的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秒
答案 2 :(得分: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)]
如果这对您有用,请告诉我
答案 3 :(得分: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
几乎立即跑。