平方是两个平方和的数字列表

Posted

技术标签:

【中文标题】平方是两个平方和的数字列表【英文标题】:List of numbers whose squares are the sum of two squares 【发布时间】:2012-10-24 07:35:16 【问题描述】:

我刚刚开始学习 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 需要数年时间来进行这些计算(我已经等了大约十分钟,它仍在打印数字)。任何有关如何解决此问题的提示将不胜感激。

附言要点是使用列表。此外,提示会比解决方案本身更受欢迎。

谢谢!

【问题讨论】:

好吧,首先,您可以将第二个 for 循环限制为 x 以下的数字。例如,8**2=64 不能表示为任何大于 64 的数字的总和。 你知道有多少这样的数字吗? 我在想,但我不确定如何用 Python 准确地编写它。感谢您的提示:D 根本没有答案,只有“任务”本身有关列表等的信息。 【参考方案1】:

我只是在其他地方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

几乎立即运行。

【讨论】:

您的实施速度给我留下了深刻的印象,但是您只能得到一个斜边解决方案,因此您的最终列表小于全套解决方案,因为对于 c=25,有两个解决方案: (15, 20, 25) 和 (7, 24, 25),我的列表理解的 len 是 881,因为它包含所有 a OP 的标题有点误导:其平方是两个平方和的数字列表 与我阅读的内容:其平方 的数字列表是两个平方之和【参考方案2】:

这可能有效:

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

让我知道这是否适合你

【讨论】:

我试过了,还是不行,试着做一些修改来修复,还是不行。无论如何谢谢:) 我运行它并在 [1, 1000] 中获得了 567 个条目。如果您可以更具体地说明什么不起作用,我可以尝试修复它【参考方案3】:

列表理解怎么样? 计算范围内的 c (1,1011) 对于 b 在 (1, c) 范围内 对于范围内的 a (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 秒

【讨论】:

【参考方案4】:

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

【讨论】:

啊,好吧。非常感谢:D,我想我已经破解了! 这基本上是一个寻找毕达哥拉斯三元组的问题。只需将c 保留在a**2 + b**2 = c**2 中即可。

以上是关于平方是两个平方和的数字列表的主要内容,如果未能解决你的问题,请参考以下文章

使用循环在 C# 中制作数字及其平方的列表

平方和

Atmel studio 汇编:8 位数字的平方根

51Nod 1080 两个数的平方和

寻找完美平方数

对列表中的所有元素进行平方