为什么这个主要因素不起作用

Why isn't this prime factors thing working?

本文关键字:不起作用 为什么      更新时间:2023-09-26
function prime(number) {
    var primeNumbers = [];
    var numberDivide = 2;
    for(var i=0; i<number; i++) {
        var nice = number/numberDivide;
        if(Math.floor(nice) == nice) {
            number = nice;
            primeNumbers.push(numberDivide);
        } else {
            numberDivide++
        }
        console.log(primeNumbers)
    }
}

这是我的代码。它没有记录最终的素数,我不知道为什么。我通过并大声说出来,但它不起作用......

首先是使用整数的代码转换,以查看函数在做什么:

function prime(number) {
    var primeNumbers = [];
    for(var divisor =2; divisor <= number;){
        if( number % divisor == 0){
            primeNumbers.push(divisor);
            number = number/divisor;
            continue;
        }
        ++divisor;
     }
    return primeNumbers;
}
console.log(    prime(18));  // returns [2,3,3]

在这里,number被替换为将其除以素因数的商,以查看是否可以在已经确定的素因数之外找到其他素因数。请注意,number会越来越小,并且当发现dividend是一个因子时,它不会递增,因此下一个循环可以测试它是否是一个多因子。

那么循环迭代了多少次呢?此版本不计算它们,但是当循环计数器(未以其他方式使用(大于或等于number时,发布的版本将停止迭代,正如所讨论的那样,循环计数器会变得越来越小。

发布的函数在prime(18)失败并返回 [2,3] 而不是 [2,3,3]。如果允许它再迭代一次,它会产生正确的结果。我还没有研究过预先计算循环的次数,但是在发布的代码中查找何时退出循环的方法是问题的原因。