题目描述:
如果3个正整数(a,b,c)满足a2 + b2 = c2的关系,则称(a,b,c)为勾股数(著名的勾三股四弦五),
为了探索勾股数的规律,我们定义如果勾股数(a,b,c)之间两两互质(即a与b,a与c,b与c之间均互质,没有公约数),则其为勾股数元组(例如(3,4,5)是勾股数元组,(6,8,10)则不是勾股数元组)。
请求出给定范围[N,M]内,所有的勾股数元组。
输入描述:
起始范围N,1 <= N <= 10000
结束范围M,N < M <= 10000
输出描述:
1. a,b,c请保证a < b < c,输出格式:a b c;
2. 多组勾股数元组请按照a升序,b升序,最后c升序的方式排序输出;
3. 给定范围中如果找不到勾股数元组时,输出”NA“。
示例1:
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
1
20
输出
3 4 5
5 12 13
8 15 17
abc三个勾股数,存在m,n,使得 a=m^2-n^2 , b=2mn, c=m^2+n^2 , gcd(m,n) = 1
# -*- coding: utf-8 -*-
'''
@File : 2023-B-勾股数元组.py
@Time : 2023/12/28 02:56:59
@Author : mgc
@Version : 1.0
@Desc : None
'''
import math
def findPrimitivePythagoreanTriplets(start, end):
limit = math.ceil(math.sqrt(end)) # 计算上限值
triplets = [] # 存储勾股数元组
for i in range(1, limit):
for j in range(i + 1, limit):
if math.gcd(i, j) != 1: # 判断i和j是否互质
continue
a = j ** 2 - i ** 2
b = 2 * i * j
if a < start or b < start: # 检查a和b是否满足起始范围
continue
c = i ** 2 + j ** 2
if c <= end:
if math.gcd(a, b) == 1 and math.gcd(a, c) == 1 and \
math.gcd(b, c) == 1: # 判断a、b、c是否互质
triplet = [a, b, c]
triplet.sort()
triplets.append(triplet)
if len(triplets) > 0:
triplets.sort()
for triplet in triplets:
print(f"{triplet[0]} {triplet[1]} {triplet[2]}")
else:
print("NA")
# 调用主函数
if __name__ == '__main__':
start = int(input()) # 起始范围
end = int(input()) # 结束范围
findPrimitivePythagoreanTriplets(start, end)