题目描述:
如果三个正整数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
输入
1
20
输出
3 4 5
5 12 13
8 15 17
示例2
输入
5
10
输出
Na
代码
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);
}
}
}
该博客主要介绍了如何在指定范围内寻找满足勾股数条件且两两互质的正整数元组(A,B,C)。定义勾股数元组需满足A² + B² = C²,并且A、B、C之间没有公约数。博客内容包括问题描述、输入输出说明、示例以及解决方案代码。

1668

被折叠的 条评论
为什么被折叠?



