【华为机试】互质问题

题目描述:
如果三个正整数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);
        }
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值