一、题目描述
如果三个正整数A、B、C ,A²+B²=C²则为勾股数 如果ABC之间两两互质,即A与B,A与C,B与C均互质没有公约数, 则称
其为勾股数元组。 请求出给定n~m范围内所有的勾股数元组。
二、输入描述
起始范围 1 < n < 10000 n < m < 10000
1
20
三、输出描述
ABC保证A<B<C 输出格式A B C 多组勾股数元组,按照A B C升序的排序方式输出。 若给定范围内,找不到勾股数元组时,输出Na。
3 4 5
5 12 13
8 15 17
四、解题思路
- 读取输入的起始范围,记为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中;
- 遍历lists,记当前元组索引为idx:
- 若满足check2(list.get(0), list.get(1), list.get(2)),即元组中的三个数存在公约数:
- 从lists中移除当前元组;
- 将idx重置为0;
- 否则,递增idx;
- 遍历结束后,输出剩余的lists中的元组;
五、JavaScript算法源码
function calculate(n, m) {
const lists = [];
for (let i = n; i <= m; i++) {
for (let j = i + 1; j <= m; j++) {
if (check1(i, j, m)) {
const list = [i, j, Math.sqrt(i * i + j * j)];
list.sort((a, b) => a - b);
lists.push(list);
}
}
}
let idx = 0;
while (idx < lists.length) {
const list = lists[idx];
if (check2(list[0], list[1], list[2])) {
lists.splice(idx, 1);
idx = 0;
} else {
idx++;
}
}
return lists;
}
function check1(a, b, max) {
const mul = a * a + b * b;
const res = Math.sqrt(mul);
const sub = Math.floor(res);
return res * res === sub * sub && sub <= max && sub > b;
}
function check2(a, b, c) {
for (let i = 2; i < c; i++) {
if ((a % i === 0 && b % i === 0) || (a % i === 0 && c % i === 0) || (b % i === 0 && c % i === 0)) {
return true;
}
}
return false;
}
六、效果展示
🏆下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。