dポイントプレゼントキャンペーン実施中!

講義でわからないのですが、以下の問をPythonを用いて答えを求めるコードを書いてください。



ピタゴラスな三角形
三辺の長さが3,4,5である三角形は直角三角形です。これは「ピタゴラスの定理」から示されます。

【ピタゴラスの定理】 直角三角形について、直角をはさむ2辺の長さがaとbで斜辺の長さがcであるとき a2 + b2 = c2 が成り立つ。
つまり、32 + 42 = 52( = 25)が成立するので直角三角形といえるのです。

三辺の長さが整数で面積が6000以下である直角三角形は何種類あるかを求めてください。

※合同なもの(例えば“3,4,5”と“5,4,3”)は区別せず1種類として数えます。

A 回答 (8件)

今度はインデントが抜けてしまいました・



import math

list_abc=[]
for b in range(1,12001):
    for a in range(1,b+1):
        if a*b > 12000: break
        c = math.sqrt(a**2+b**2)
        if c == int(c): list_abc.append((a,b,int(c)))

print("The number of combinations = %d" % len(list_abc))
    • good
    • 0

No. 6 の回答、間違えました!正解は



import math

list_abc=[]
for b in range(1,12001):
for a in range(1,b+1):
if a*b > 12000: break
c = math.sqrt(a**2+b**2)
if c == int(c): list_abc.append((a,b,int(c)))

print("The number of combinations = %d" % len(list_abc))
    • good
    • 0

import math



list_abc=[]
for b in range(1,12001):
    for a in range(1,b+1):
        c_square = a**2+b**2
        if c_square > 12000: break
        c = math.sqrt(c_square)
        if c == int(c): list_abc.append((a,b,int(c)))

print("The number of combinations = %d" % len(list_abc))    

おかしいなぁ。58個しか答えがないです。
    • good
    • 0

No4.補足。


>c = math.floor(math.sqrt(cs) + 0.001)
>if c**2 == cs:
は平方根の誤差を考慮したものですが、平方根は IEEE754 の
基本演算なので、この配慮は不要ですね。
ころっと忘れてました。

if int(math.sqrt(cs))**2 == cs:

で十分。
    • good
    • 0

import math



a = 1
list = []
while a**2/2 < 6000:
  b = a + 1
  while a*b/2 <= 6000:
    cs = a**2 + b**2
    c = math.floor(math.sqrt(cs) + 0.001)
    if c**2 == cs:
      list.append((a, b, c))
      print(a, b, c)
    b += 1
  a += 1


print(list)
print(len(list))

わかりやすさを心がけてみました(^^;

インデントは全角スペースに置き換えてあるのでご注意を。

121個
    • good
    • 0

あ、ゴメン、判定間違ってるわ。



# ここから

#!/usr/bin/env python3

import math, itertools

def foo(n):
 max_area = 2 * n
 return sum([[[a, b, int(math.sqrt(a**2 + b**2))] \
    for b in range(1, math.ceil(max_area / a)) \
    if math.sqrt(a**2 + b**2).is_integer()] \
    for a in range(1, max_area + 1)], [])

def bar(lst):
 newLst = []
 while lst != []:
  elm = lst[0]
  lst = [i for i in lst if not tuple(i) in itertools.permutations(elm)]
  newLst += [elm]
 return newLst

if __name__ == '__main__':
 print(len(bar(foo(6000))))
「python: 直角三角形の種類を求める」の回答画像3
    • good
    • 0

001: 6.0 [ 3, 4, 5]


002: 24.0 [ 6, 8, 10]
003: 30.0 [ 5, 12, 13]
(snip)
120:5880.0 [ 70,168,182]
121:6000.0 [ 80,150,170]
    • good
    • 0

#!/usr/bin/env python3



import math

def foo(n):
 max_area = 2 * n
 return sum([[[a, b, int(math.sqrt(a**2 + b**2))] \
    for b in range(1, math.ceil(max_area / a)) \
    if math.sqrt(a**2 + b**2).is_integer()] \
    for a in range(1, max_area + 1)], [])

def bar(lst):
 newLst = []
 while lst != []:
  elm = lst[0]
  lst = [i for i in lst if sum(elm) != sum(i)]
  newLst += [elm]
 return newLst

if __name__ == '__main__':
 print(len(bar(foo(6000))))
「python: 直角三角形の種類を求める」の回答画像1
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!