题目描述:
如果三个正整数A、B、C ,A²+B²=C²则为勾股数
如果ABC之间两两互质,即A与B,A与C,B与C均互质没有公约数,
则称其为勾股数元组。
请求出给定n~m范围内所有的勾股数元组式
输入描述
起始范围
1 < n < 10000
n < m < 10000
1
2
输出描述
ABC保证A<B<C
输出格式A B C
多组勾股数元组,按照A B C升序的排序方式输出。
若给定范围内,找不到勾股数元组时,输出Na。
示例1
输入
1
20
输出
3 4 5
5 12 13
8 15 17
1
2
3
4
5
6
7
示例2
输入
5
10
输出
Na
1
2
3
4
5
代码
import java.util.Scanner;
public class starOne_01 {
public static void main(String[] args) {
try (//输入范围(n,m),保证输入的数据中1<n<10000且n<m<10000
Scanner scanner = new Scanner(System.in)) {
System.out.println("请输入n=");
int n = scanner.nextInt();
System.out.println("请输入m=");
int m = scanner.nextInt();
while(1 > n || n > 10000 || n >= m || m > 10000){
System.out.println("请重新输入,当前不符合输入原则,保证1<n<10000且n<m<10000");
System.out.println("请输入n=");
n = scanner.nextInt();
System.out.println("请输入m=");
m = scanner.nextInt();
}
solution(n,m);
}
}
private static void solution(int n,int m){
int count = 0 ;//计数,当没有符合要求的组合,则输出Na
for(int i = n ; i < m ; i++){
for(int j = n+1 ; j < m ; j++){
for(int k = n+2 ; k<=m ; k++){
if(i < j && j < k && i*i+j*j == k*k && relativePrime(i,j) == 1 && relativePrime(j,k) == 1 && relativePrime(i,k) == 1){
//这里限制i<j<k是可以遍历所有组合,并方便互质函数的参数要求
//当i^2+j^2=k^2,且i、j、k两两互质
System.out.printf("%d %d %d\n",i,j,k);
count++;
}
}
}
}
if(count == 0){
System.out.println("Na");
}
}
private static int relativePrime(int x , int y){
//这里的x和y由于被0<n<m<10000的输入范围限制,可以不用判断为0的情况。
//且在处理函数内限制了x < y,所以不用比较x和y的大小
//下列递归算法也叫辗转相除法、欧几里得算法,用于判断两数是否互质
if(x % y == 0){
return y;
}else{
return relativePrime(y, x%y);
}
}
}