7

私はPythonを学び始めたばかりで、スキルを磨くためにいくつかの問題を解決し始めましたが、この質問にはかなりこだわっています。

1000までのすべての正の整数を含むリストを作成します。その二乗は、2つの二乗の合計として表すことができます(つまり、p ^ 2 = m ^ 2 + n ^ 2である整数p。ここで、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がこれらの計算を行うのに何年もかかることです(私は約10分待っていましたが、まだ数値を出力しています)。これを解決する方法についてのヒントをいただければ幸いです。

ps主なポイントはリストを使用することです。また、ヒントはソリューション自体よりも高く評価されます。

ありがとう!

4

4 に答える 4

7

まず第一に、あなたは問題を解決していません。(x+b)**.5実際に整数であることを確認するためにチェックを行う必要があります。第二に、あなたが数字を印刷しているなら、あなたはすでにすべての数字を計算しています。上記を行うと、このステップに必要な時間が短縮されます。

于 2012-11-04T03:00:22.687 に答える
2

リスト内包はどうですか?範囲(1、b)のaの範囲(1、c)のbの範囲(1,1011)のcを計算します

次のように:

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 に答える