勾股数元组js

题目:

如果3个正整数(a,b,c)满足a^{2}+b^{2}=c^{2}的关系,则称(a,b,c)为勾股数(著名的勾三股四弦五),为了探索勾股数的规律,我们定义如果勾股数(a,b,c)之间两两互质(即a与b,a与c,b与c之间均互质,没有公约数),则其为勾股数元祖(例如(3,4,5)是勾股数元祖,(6,8,10)则不是勾股数元祖)。请求出给定范围[N,M]内,所有的勾股数元祖。

勾股数元组js_第1张图片

解题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 = m^{2}-n^{2} ,b = 2mn, c =m^{2}+n^{2},也就是当存在m、n时,这一组勾股数就是勾股数元组。例如:3、4、5这一组数中,存在m=1,n=2使得上述公式都成立。

根据c=m^{2}+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博客_勾股数元组

你可能感兴趣的:(牛客,javascript,算法)