如何在区间(从1到 给定的数字 )中找到一个数字,当将其分解为质数时,数量最多。
示例:
输入:9
输出:8
说明:
8 = 2 * 2 * 2(3个素数)
7 = 7 * 1(1个素数)
6 = 3 * 2(2个质数)
以此类推...最后,我们将看到8在分解中的质数最大。
规格:
如果分解中有多个素数相同的数,则返回最大数。
答案 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的数字进行某些处理。