✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1. 题目描述
- 2. 输入描述
- 3. 输出描述
- 4. Java算法源码
- 5. 测试
- 6.解题思路
1. 题目描述
如果三个正整数A、B、C ,A²+B²=C²则为勾股数 如果ABC之间两两互质,即A与B,A与C,B与C均互质没有公约数, 则称
其为勾股数元组。 请求出给定n~m范围内所有的勾股数元组。
2. 输入描述
起始范围 1 < n < 10000 n < m < 10000
1
20
3. 输出描述
ABC保证A<B<C 输出格式A B C 多组勾股数元组,按照A B C升序的排序方式输出。 若给定范围内,找不到勾股数元组时,输出Na。
3 4 5
5 12 13
8 15 17
4. Java算法源码
public static void main(String[] args) {Scanner sc = new Scanner(System.in);int a = sc.nextInt();int b = sc.nextInt();List<List<Integer>> lists = new ArrayList<>();for (int i = a; i <= b; i++) {for (int j = i + 1; j <= b; j++) {if (check1(i, j, b)) {List<Integer> list = new ArrayList<Integer>();list.add(i);list.add(j);list.add((int) Math.sqrt(i * i + j * j));Collections.sort(list);lists.add(list);}}}int idx = 0;while (idx < lists.size()) {List<Integer> list = lists.get(idx);if (check2(list.get(0), list.get(1), list.get(2))) {lists.remove(idx);idx = 0;}idx++;}for (List<Integer> list : lists) {System.out.println(list.get(0) + " " + list.get(1) + " " + list.get(2));}
}private static boolean check1(int a, int b, int max) {int mul = a * a + b * b;double res = Math.sqrt(mul);int sub = (int) res;return res * res == sub * sub && sub <= max && sub > b;
}private static boolean check2(int a, int b, int c) {for (int i = 2; i < c; i++) {if (a % i == 0 && b % i == 0) {return true;} else if (a % i == 0 && c % i == 0) {return true;} else if (b % i == 0 && c % i == 0) {return true;}}return false;
}
5. 测试
6.解题思路
题目要求找出给定范围内的所有勾股数元组,其中勾股数元组满足条件:三个正整数A、B、C,满足A² + B² = C²,并且A、B、C两两互质(没有公约数)。
算法流程:
- 读取输入的起始范围,记为n和m。
- 创建一个列表
lists
,用于保存找到的勾股数元组。 - 遍历范围n到m之间的所有整数,记当前整数为i:
- 在范围[i+1, m]内遍历所有整数,记当前整数为j:
- 若满足check1(i, j, m),即i、j、(i²+j²)的平方根均为整数且不超过m,满足勾股数的条件:
- 创建一个列表
list
,将i、j和(i²+j²)的平方根按升序添加到list
中。 - 将
list
添加到lists
中。
- 创建一个列表
- 若满足check1(i, j, m),即i、j、(i²+j²)的平方根均为整数且不超过m,满足勾股数的条件:
- 在范围[i+1, m]内遍历所有整数,记当前整数为j:
- 遍历lists,记当前元组索引为idx:
- 若满足check2(list.get(0), list.get(1), list.get(2)),即元组中的三个数存在公约数:
- 从
lists
中移除当前元组。 - 将
idx
重置为0。
- 从
- 否则,递增
idx
。
- 若满足check2(list.get(0), list.get(1), list.get(2)),即元组中的三个数存在公约数:
- 遍历结束后,输出剩余的
lists
中的元组。