分解一个质数

时间:2018-07-14 13:21:12

标签: javascript arrays loops primes factorization

如何在区间(从1到 给定的数字 )中找到一个数字,当将其分解为质数时,数量最多。

示例:

输入:9

输出:8

说明:

8 = 2 * 2 * 2(3个素数)

7 = 7 * 1(1个素数)

6 = 3 * 2(2个质数)

以此类推...最后,我们将看到8在分解中的质数最大。

规格:

如果分解中有多个素数相同的数,则返回最大数。

2 个答案:

答案 0 :(得分:0)

好的,我想我理解您的要求。

这是一个简单的脚本,可以执行您所要求的操作。

//source of this function: https://jsfiddle.net/JamesOR/RC7SY/

function getAllFactorsFor(remainder) {
    var factors = [], i;

    for (i = 2; i <= remainder; i++) {
        while ((remainder % i) === 0) {
            factors.push(i);
            remainder /= i;
        }
    }

    return factors;
}

function calculate(x) {

    lastFactorCount = 0;
    highestNumber = 0;

    while (x) {
        currentCount = getAllFactorsFor(x).length;

        if (currentCount > lastFactorCount) {
            lastFactorCount = currentCount;
            highestNumber = x;
        }

        x--;
    }

    return highestNumber;
}

console.log(calculate(7)); //output: 6
console.log(calculate(11)) //output: 8

通过您给出的两个测试用例。我从发现的jsfiddle中借用了getAllFactorsFor()函数,因为我们不需要重新发明任何东西;)

calculate()函数接受一个输入数字,然后从x到0循环遍历每个数字,计算出它有多少个因数,并在每次迭代中递减x时跟踪最后一个因数计数。

最后,它输出因子计数最高的数字。很简单。

希望有帮助!

答案 1 :(得分:0)

请注意,在2和3之后,下一个质数是5,大于2 * 2(显然)。因此,使用2 * 2总是比所有较高的质数更好。数量最高的2作为素数仍然小于或等于2 ** Math.floor(Math.log2(num))。我们唯一需要检查的是,用3替换最后一个素数2是否仍会低于该数字,因为这可能会发生,并且会产生更大的数字。再次注意,使用多个3将是3 * 3 = 9> 8 = 2 * 2 * 2,这不能再次解决。所有这些加在一起得出解决方案应该只是

const f = num => {
  let twoEnd = 2 ** Math.floor(Math.log2(num));
  let threeEnd = twoEnd / 2 * 3;
  return threeEnd <= num ? threeEnd : twoEnd;
}

根据情况,可能需要对小于2的数字进行某些处理。