を得る100の下のCと16をtheresの、あなたは単に、内側のループから抜け出すに進みたくありません次の反復。
次のテスト
は、彼らが
真なることはありませんでき
m
と
n
あなたといるので、完全に不要です。
if n**2-m**2==0 or 2*m*n ==0 or n**2+m**2==0:
ですので、コードから削除しました。あなたはgcd
関数を提供していないか、または標準ライブラリから1つをインポートしたので、私は自分自身を提供しました。
def gcd(a, b):
''' Greatest common divisor of a & b '''
while b:
a, b = b, a % b
return a
def prim(k):
primlist=[]
for m in range(1,k):
for n in range(m+1,k+1):
if m**2 + n**2 > k:
break
if m%2==1 and n%2==1:
continue
if gcd(m,n)!=1:
continue
primlist.append([n**2 - m**2, 2*m*n, n**2 + m**2])
return primlist
print(prim(100))
出力
[[3, 4, 5], [15, 8, 17], [35, 12, 37], [63, 16, 65], [5, 12, 13], [21, 20, 29], [45, 28, 53], [77, 36, 85], [7, 24, 25], [55, 48, 73], [9, 40, 41], [33, 56, 65], [65, 72, 97], [11, 60, 61], [39, 80, 89], [13, 84, 85]]
FWIWは、ここにそのコードを書くためのより効率的な(そして少しPython的)な方法です。リストを作成するのではなく、ジェネレータを作成します。そうすれば、トリプルを印刷したり消費したりすることができます。もちろん、list(prim(100))
のようにリストに集めることも簡単です。
def gcd(a, b):
''' Greatest common divisor of a & b '''
while b:
a, b = b, a % b
return a
def prim(k):
for m in range(1, k):
for n in range(m+1, k+1):
m2, n2 = m * m, n * n
if m2 + n2 > k:
break
if m % 2 and n % 2:
continue
if gcd(m, n) > 1:
continue
yield n2 - m2, 2*m*n, n2 + m2
for i, t in enumerate(prim(100), 1):
print(i, t)
出力
1 (3, 4, 5)
2 (15, 8, 17)
3 (35, 12, 37)
4 (63, 16, 65)
5 (5, 12, 13)
6 (21, 20, 29)
7 (45, 28, 53)
8 (77, 36, 85)
9 (7, 24, 25)
10 (55, 48, 73)
11 (9, 40, 41)
12 (33, 56, 65)
13 (65, 72, 97)
14 (11, 60, 61)
15 (39, 80, 89)
16 (13, 84, 85)
はSO壊れたコードを修正したり宿題を終らないように、特定の質問をすることがあります。あなたの質問はあなたがすでに試したこととあなたのコードがうまくいかない理由で更新してください。 – Vroomfondel
@Vroomfondelこの質問に間違いはありません。営業担当者はMCVEを掲載し、予想される生産量と実際の生産量を適切に記述した。 –
まあ、私は問題を見つけることができないコードを入れて、問題が何であるかを言いました。コードがどこに間違っていたのか分からなければ、疑問を投げかけます。 –