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]); }); } }