题目描述
如果三个正整数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
详细代码
import org.junit.Test;
import java.util.Scanner;
/**
* @Author: gyt
* @Version: 1.0
**/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
solution(n, m);
}
private static void solution(int n, int m) {
boolean isNa = true;
for (int i = n; i < m - 1; i++) {
for (int j = i + 1; j < m; j++) {
// 判断两数是否互质
if (!isPrime(i, j)) {
continue;
}
for (int k = j + 1; k < m + 1; k++) {
// 判断i,k是否互质 && 判断j,k是否互质
if (isPrime(i, k) && isPrime(j, k) && (i * i + j * j == k * k)) {
isNa = false;
System.out.printf("%d %d %d\n", i, j, k);
}
}
}
}
if (isNa) {
System.out.println("Na");
}
}
private static boolean isPrime(int i, int j) {
if (i <= 1 || j <= 1) {
return false;
}
// 取最小数的开方值
int sqrt = (int) Math.sqrt(Math.min(i, j));
for (int x = 2; x <= sqrt; x++) {
if (i % x == 0 && j % x == 0) {
return false;
}
}
return true;
}
@Test
public void test() {
solution(1, 20);
}
}