题目
若三个正整数a、b、c,其中a<=b<=c,满足a^2+b^2=c^2,其中^表示上标,称这三个数为“勾股数”,例如:3、4、5是勾股数。编程输出不大于n的所有勾股数。 输入格式 输入一个数(n<=100) 输出格式 输出所有勾股数,按第1个数字由小到大排列(若第1个数字相同,按第2个数字排) 输入样例 16 输出样例 3 4 5 5 12 13 6 8 10 9 12 15
解题
n = int(input())
def ggs(x,y,z):
if x**2 +y**2 == z**2:
return x,y,z
for i in range(3,n):
for j in range(3,i):
for z in range(3,i):
if ggs(j,z,i):
if j <= z:
print(f'{j} {z} {i}')
可以发现并没有满足输出格式的要求,按j的大小排序,所以决定将结果放进列表中,排好序再输出
n = int(input())
def ggs(x,y,z):
if x**2 +y**2 == z**2:
return x,y,z
result = []
for i in range(3,n):
for j in range(3,i):
for z in range(3,i):
if ggs(j,z,i):
if j <= z:
result.append([j,z,i])
result.sort()
for i in range(len(result)):
print(f'{result[i][0]} {result[i][1]} {result[i][2]}')
本来以为这样就差不多了,结果检验之后发现依然存在问题
发现竟然少了一组18的,太奇怪了,又不是中间又不是结尾的,后面发现是i的范围选择错了,改成(3,n+1)就可以顺利通过啦!
后面给大家提供另一种方法
def find_pythagorean_triples(n):
result = []
for a in range(3, n + 1):
for b in range(a, n + 1):
if c <= n and c == a ** 2 + b ** 2:
result.append([a, b, c])
result.sort()
return result
n = int(input())
triples = find_pythagorean_triples(n)
for triple in triples:
print(f'{triple[0]} {triple[1]} {triple[2]}')
这个代码存在问题的,c这样子虽然简洁了,但是没有定义,所以需要修改,在判断之前引入一个变量。
def find_pythagorean_triples(n):
result = []
for a in range(3, n + 1):
for b in range(a, n + 1):
c_square = a ** 2 + b ** 2
c = int(c_square ** 0.5)
if c <= n and c ** 2 == c_square:
result.append([a, b, c])
result.sort()
return result
n = int(input())
triples = find_pythagorean_triples(n)
for triple in triples:
print(f'{triple[0]} {triple[1]} {triple[2]}')
这样就可以啦