
如果3个正整数(a,b,c)满足的关系,则称(a,b,c)为勾股数(著名的勾三股四弦五),为了探索勾股数的规律,我们定义如果勾股数(a,b,c)之间两两互质(即a与b,a与c,b与c之间均互质,没有公约数),则其为勾股数元祖(例如(3,4,5)是勾股数元祖,(6,8,10)则不是勾股数元祖)。请求出给定范围[N,M]内,所有的勾股数元祖。
解题1:代码:1.依次判断这三个数是否互质,将判断互质方法封装成一个函数。如果两个数有公约数,那么就返回1,这两个数不互质。
2.只要这三个数当中任意两个不互质,那么这一组数就不是勾股数元组。因此使用的是 || 运算符。
3.因为a^2+b^2=c^2 ,因此a
function isExistPrime(q,p) {
//判断两个数是否互质,如果互质返回0,不互质返回1
let max = (q > p) ? q : p
for(let i = 2 ; i <= max ;i++) {
if(q % i == 0 && p % i == 0) {
return 1
}
}
return 0
}
function existPrimeTri(x,y,z) {
//如果任意两个数不互质,也就是为1,那么这一组勾股数就不是元组,返回1。
if(isExistPrime(x,y) || isExistPrime(x,z) || isExistPrime(z,y)) {
return 1
}else{
return 0
}
}
function main(n,m,flag) {
for(let a = n ; a<= m; a++ ) {
for(let b = a+1; b<=m ; b++) {
for(let c = b+1; c<=m; c++) {
if(Math.pow(a,2) + Math.pow(b,2) == Math.pow(c,2) && !existPrimeTri(a,b,c)) {
console.log(`${a} ${b} ${c}`)
flag++
}
}
}
}
//flag为0说明不存在勾股数元组。
if(flag == 0) {
console.log('NA')
}
}
题解2:
代码:对于一组素勾股数
(a,b,c),存在m、n使得 a = ,b = , c =,也就是当存在m、n时,这一组勾股数就是勾股数元组。例如:3、4、5这一组数中,存在m=1,n=2使得上述公式都成立。根据,m、n大于0,则m、n一定小于c的平方。
function main(boundary) {
let res = 0
const len = Math.ceil(Math.sqrt(boundary))
for (let i = 1; i < len; i++) {
for (let j = i + 1; j < len; j++) {
// i、j不互质,跳过进行下一次循环。
if(isCoprime(i, j) !== 1) continue
let a = Math.pow(j, 2) - Math.pow(i, 2)
let b = 2 * i * j
let c = Math.pow(j, 2) + Math.pow(i, 2)
if (c <= input) {
// 勾股数任意两两互质,这里应该使用&&运算符。
if ((isCoprime(a, b) === 1) && (isCoprime(a, c) === 1) && (isCoprime(b, c) === 1)) {
// 勾股数两两互质
console.log(`${a} ${b} ${c}`)
res++
}
}
}
}
if(res == 0) {
console.log('NA')
}
}
// 判断两个数是否互质:最大公因数是否为1,如果互质,那么最终输出为1。
function isCoprime(x, y) {
if (y === 0) {
return x
} else {
return isCoprime(y, x % y)
}
}
本文参考了该博主的优质文章:华为机试练习(四)勾股数元组_下一个路口遇见你48的博客-CSDN博客_勾股数元组
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)