题目描述
如果三个正整数A
、B
、C
,A² + B² = C²
则为勾股数,
如果ABC
之间两两互质,即A
与B
,A
与C
,B
与C
均互质没有公约数,则称其为勾股数元组。
请求出给定 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;
}