【问题标题】:Decompose a number in prime numbers分解素数中的数字
【发布时间】:2018-07-14 13:21:12
【问题描述】:

如何在区间(从 1 到 给定数)内找到一个数,当分解为质数时,该数具有最大数量。

示例:

输入:9

输出:8

说明:

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

7 = 7 * 1(1 个素数)

6 = 3 * 2 ( 2 个素数)

以此类推...最后,我们将看到 8 在分解中具有最多的素数。

规格:

如果分解时有多个具有相同质数的数,则返回其中最大的数。

【问题讨论】:

  • 是有问题还是只是在炫耀自己的编码风格?
  • 请添加另一个示例。至少我不清楚
  • 哥们,你没看到任务的输出和我的不匹配吗?
  • @csmckelvey 我解释了我的代码是如何工作的......预测输出并不难
  • 发布您的代码输出而不是要求我们免费帮手做的比我们必须做的更多也不是那么难。如果你想得到答案,你应该让这里的所有志愿者尽可能容易。

标签: javascript arrays loops primes factorization


【解决方案1】:

好的,我想我明白你的要求了。

这里有一个简单的脚本来做你所要求的。

//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 的同时跟踪最后一个因子计数。

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

希望对你有帮助!!

【讨论】:

  • 在 O(n²) 中解决 O(1) 问题。此外,如果您想通过这样的循环获取所有因子,请迭代到 Math.sqrt(remainder) 并添加对最后一个素数的简单检查,使其成为 O(sqrt(n)) 而不是 O(n)(其中 n 是号本身)。除非您至少要实现通用数字字段筛或类似功能。
  • 有趣!但正如我在回答中提到的那样,我从另一个来源借用了计算因素的功能,并给予了适当的信任;)我只关心向 OP 提供他所缺少的线索,而不是关于如何实际实施因子分解法。无论如何,我想看看你将如何以 O(1) 的复杂性来解决这个问题,正如你在评论中提到的那样。?
  • 我在 11 小时前发布了答案,在 12 小时前发布了相同代码的评论;)
  • 它是否给出了 OP 要求的确切解决方案?并具有 O(1) 复杂性? ;) 我不批评你的回答。但是只看到了一个返回因子的函数(没有检查它是否有效,但我确定它没有回答原始问题)
  • 除了理论上,for (let i = 2; i &lt; 3000; i++) { if (f(i) !== calculate(i)) alert(i); } 不会给出单一的警报,它至少会返回与您的函数相同的结果对于前 3000 个整数。
【解决方案2】:

请注意,在 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 的数字进行一些处理。

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 2014-07-11
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 2012-05-20
    相关资源
    最近更新 更多