华为OD机试真题 勾股数元组 JavaScript java python c++ 参考解题

题目描述

如果三个正整数ABC ,A² + B² = C² 则为勾股数,

如果ABC之间两两互质,即ABACBC均互质没有公约数,则称其为勾股数元组。

请求出给定 n ~ m 范围内所有的勾股数元组。

输入描述

起始范围

1 < n < 10000

n < m < 10000

输出描述

ABC保证A < B < C

输出格式A B C

多组勾股数元组,按照A B C升序的排序方式输出。

若给定范围内,找不到勾股数元组时,输出Na

示例一

输入

1
20

输出

3 4 5
5 12 13
8 15 17

示例二

输入

5
10

输出

Na

 参考解题

 javascript

function gcd(a, b) {
  // 计算a和b的最大公约数
  while (b) {
    [a, b] = [b, a % b];
  }
  return a;
}

function main(n, m) {
  const results = [];
  for (let c = n + 1; c <= m; c++) {
    for (let b = n; b < c; b++) {
      const a2 = c * c - b * b;
      if (a2 <= 0) {
        break;
      }
      const a = Math.floor(Math.sqrt(a2));
      if (a * a === a2 && a < b && gcd(a, b) === 1) {
        results.push([a, b, c]);
      }
    }
  }

  if (results.length === 0) {
    console.log("Na");
  } else {
    results.sort((a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2]);
    for (const [a, b, c] of results) {
      console.log(`${a} ${b} ${c}`);
    }
  }
}

java

import java.util.*;

public class PythagoreanTriples {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();

        List<int[]> results = new ArrayList<>();

        for (int c = n + 1; c <= m; c++) {
            for (int b = n; b < c; b++) {
                int a2 = c * c - b * b;
                if (a2 <= 0) {
                    break;
                }
                int a = (int) Math.sqrt(a2);
                if (a * a == a2 && a < b && gcd(a, b) == 1) {
                    results.add(new int[]{a, b, c});
                }
            }
        }

        if (results.size() == 0) {
            System.out.println("Na");
        } else {
            results.sort((a, b) -> a[0] - b[0] != 0 ? a[0] - b[0] : a[1] - b[1] != 0 ? a[1] - b[1] : a[2] - b[2]);
            for (int[] triple : results) {
                System.out.println(triple[0] + " " + triple[1] + " " + triple[2]);
            }
        }
    }

    public static int gcd(int a, int b) {
        while (b != 0) {
            int temp = a % b;
            a = b;
            b = temp;
        }
        return a;
    }
}

python

import math

def gcd(a, b):
    while b != 0:
        a, b = b, a % b
    return a

def main(n, m):
    results = []
    for c in range(n + 1, m + 1):
        for b in range(n, c):
            a2 = c * c - b * b
            if a2 <= 0:
                break
            a = int(math.sqrt(a2))
            if a * a == a2 and a < b and gcd(a, b) == 1:
                results.append((a, b, c))
    if len(results) == 0:
        print("Na")
    else:
        results.sort()
        for triple in results:
            print(triple[0], triple[1], triple[2])

main(1, 170)

 c++

#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>

using namespace std;

bool is_coprime(int a, int b) {
    return __gcd(a, b) == 1;
}

vector<tuple<int, int, int>> find_pythagorean_triples(int n, int m) {
    vector<tuple<int, int, int>> results;
    for (int c = n+1; c <= m; c++) {
        for (int b = n; b < c; b++) {
            int a = sqrt(c*c - b*b);
            if (a > n && a*a + b*b == c*c && is_coprime(a, b) && is_coprime(a, c) && is_coprime(b, c)) {
                results.push_back(make_tuple(a, b, c));
            }
        }
    }
    return results;
}

int main() {
    int n, m;
    cin >> n >> m;

    vector<tuple<int, int, int>> results = find_pythagorean_triples(n, m);

    if (results.empty()) {
        cout << "Na" << endl;
    }
    else {
        sort(results.begin(), results.end());
        for (auto result : results) {
            cout << get<0>(result) << " " << get<1>(result) << " " << get<2>(result) << endl;
        }
    }

    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值