【笔试】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]); }); } }