【筆試】2、勾股數元祖或者素勾股數


package y2020.interview.huawei.gougushu;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @Auther: xiaof
 * @Date: 2020/3/11 10:25
 * @Description:勾股數元祖 素勾股數的個數
 *
 * 勾股數,是由三個正整數組成的數組;能符合勾股定理 a*a + b*b = c*c ,(a, b, c) 的正整數解。如果 (a, b, c) 是勾股數,
 * 它們的正整數倍數,也是勾股數。如果 (a, b, c) 互質,它們就稱為素勾股數。給定正整數N, 計算出小於或等於N的素勾股數個數。
 *
 */
public class Main {

    public static List solution(int n, int m) {
        List res = new ArrayList();
        for (int a = n; a <= m - 2; ++a) {
            for (int b = a + 1; b <= m - 1; ++b) {
                //求c
                double c = Math.sqrt(Math.pow(a,2) + Math.pow(b,2));
                long cz = (long) c;
                if (c - cz == 0 && c <= m && isPrim(a,b) && isPrim(a, (int) c) && isPrim(b, (int) c)) {
                    res.add(new int[]{a, b, (int) c});
                } else if (c > m) {
                    break;
                }
            }
        }

        return res;
    }

    //判斷a,b,c互質
    public static boolean isPrim(int a, int b) {
        if(a < b) {
            int tmp = a;
            a = b;
            b = tmp;
        }
        int c;
        //輾轉相除
        while((c = a % b) != 0) {
            a = b;
            b = c;
        }
        return b == 1;
    }


    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();

        List<int[]> res = solution(n, m);
        res.forEach(res1 -> {
            System.out.println(res1[0] + " " + res1[1] + " " + res1[2]);
        });

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM