2023年华为OD机试(python)B卷-勾股数元组

发布时间:2023年12月30日

一、题目

题目描述:

如果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)
文章来源:https://blog.csdn.net/u014481728/article/details/135259270
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。