【问题标题】:JavaScript: Function not returning largest prime factorJavaScript:函数未返回最大素数
【发布时间】:2018-11-30 21:38:52
【问题描述】:

输入:13195
预期结果:29(输入的最大素数)
实际结果:2639(输入的最大因子,但不是素数)

我不关心偶数,因为最大的素数要么是 2,要么是奇素数乘以 2 来得到输入,那么有什么意义呢。

function findPrimeFactor(num) {

    let prime;

    for (let factor = 3; factor < num; factor += 2) {
        if (num % factor === 0) {
            for (let i = 3; i < factor; i += 2) {
                if (factor % i === 0) {
                    break;
                }
                else {
                    prime = factor;
                }
            }
        }
    }
    return prime;
}

【问题讨论】:

    标签: javascript loops primes prime-factoring


    【解决方案1】:

    供参考click here,还有其他语言,我做了js的

    function findPrimeFactor(num) {
        // Initialize the maximum prime factor
        // variable with the lowest one
        let prime = -1;
    
        // Print the number of 2s
        // that divide n
        while (num % 2 === 0) {
            prime = 2;
            num = num / 2;
        }
    
        // n must be odd at this point,
        // thus skip the even numbers
        // and iterate only for odd
        // integers       
        for (let factor = 3; factor <= Math.sqrt(num); factor += 2) {
            while (num % factor === 0) {
                prime = factor;
                num = num / factor;
            }
        }
    
        // This condition is to handle
        // the case when n is a prime
        // number greater than 2
        if (num>2)
           prime = num;
    
        return prime;
    }
    

    【讨论】:

    • 是的,我之前在研究这个时看到了那个链接。但我想知道为什么我需要将 num 划分回那个 while 循环的因子。
    • 哪一个while循环?第二个?
    • 是的,嵌套在 for 循环中的 while 循环迭代奇数
    • 因为如果你发现一个数字可能被“3”整除,你需要检查它可以被3整除多少次:) 像 -> 27 -> 你发现它可以除以 3 -> 27/3 = 9 -> 9 可以再除以 3 吗?是的,所以 9 / 3 = 3,3 可以除以 3 吗?是的等等......
    【解决方案2】:

    您的代码的问题出在 else 块中。每次程序流进入该块时,您将 prime 值替换为 factor 值。答案是在 else 块中添加一个额外的临时变量,替换它的值。 我在下面的代码中为你做了:

    function findPrimeFactor(num) {
    
    let prime;
    let temp = 3;    // Default value for numbers those their largest prime factor is 3
    for (let factor = 3; factor < num; factor += 2) {
        if (num % factor === 0) {
            for (let i = 3; i < factor; i += 2) {
                if (factor % i === 0) {
                temp = prime;  // This value is not prime, so we should not replace the value of prime variable with it.
                    break;
                }
                else {
                    temp = factor; // This factor could be prime. We save it in the temp. If the for loop never meets the upper if block, so this is prime and we can have it.
                }
            }
            prime = temp; // temp value now is a prime number. so we save it to prime variable
        }
    }
    return prime;
    }
    

    我只是更正了您的代码行为,并没有添加额外的行为。 希望这对您有所帮助。

    【讨论】:

    • 我想我明白你在说什么。因此,如果因子是 203,一个非质数,当它第一次进入嵌套循环并进行检查时:203 % 3 != 0,这样就会自动放入它在 else 块 (在我的函数中)?
    • 是的,就是这样。我在上面的代码中为你更正了。
    • 这不适用于很多数字顺便说一句。它返回 undefined 很多次。 (尝试使用 27,它返回 undefined 而不是 3)
    • 谢谢。我编辑了最大素数为 3 的数字的答案。但该函数仍然返回未定义的素数。我没有更正的原因是提问者不想这样。
    猜你喜欢
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2012-07-19
    相关资源
    最近更新 更多