确定最大素因子的函数

时间:2015-06-05 04:59:16

标签: javascript algorithm numbers

我正在尝试在JS中编写一个返回数字最大“素数”因子的函数。例如,如果我运行maxPrimeFactor(57),我应该返回19。但是,我的功能只在部分时间内有效。我编写了一个名为isPrime的辅助函数,它返回一个布尔值,表示给定的数字是否为素数。

任何人都可以检查我的逻辑,并指出我可能出错的地方/如何改进我的算法和实现?任何帮助表示赞赏。

function isPrime(n){
    var flag = true;

    for (var i = 2; i < n / 2; i++) {
        if (n % i == 0) {
            flag = false;
            return flag;
        }
    }

    return flag;
}

function maxPrimeFactor (n) {
    var max = 1;

    for (var i = 1; i <= n/2; i++) {
        if (n % i == 0 && isPrime(i)) {
            max = i;
        }
    }

    return max; 
}

2 个答案:

答案 0 :(得分:1)

1不是素数,因此如果将1传递给函数,它将返回1作为最大素数因子,这是不正确的。也许返回值为NaN或undefined的检查可能有助于防止无效值,这取决于您是否需要限制输入的范围。

    if (n < 2) {
        return NaN;
    }  

你还需要考虑n是素数时的情况。更有效的方法是将max初始化为n,然后如果再次设置max,则max prime为n。

function maxPrimeFactor (n) {
    var max = n;
    for (var i = 2; i <= n/2; i++) {
        if (n % i == 0 && isPrime(i)) {
            max = i;
        }
    }
    return max;
}

由于算法只关注最大素数因子,如果从n / 2开始倒计时,可以进一步优化函数以返回找到的第一个素数因子,否则返回数字。

由于isPrime()中的局部var标志不能使代码更具可读性或功能性,我会将其删除。 (此外,不需要循环到n / 2,因为没有数字的素数大于它的平方根);

function isPrime(n){
    for (var i = 2; i < Math.sqrt(n); i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

答案 1 :(得分:-2)

我给你一个用C ++编写的代码:

#include <cstdio>
#include <cmath>

int max(int x, int y)
{
    return x > y ? x : y;
}

int maxPrime(int x)
{
    int mx = -1;
    int curX = x;
    /*i * i <= x is correct, because there is only one prime factor larger than 
      Sqrt(x), it's power must be 1, and actually it is curX after this loop, because
      all prime factor less or equal than Sqrt(x) is eliminated.*/
    for(int i = 2; i * i <= x; ++i)
    {
        while(curX % i == 0)
        {
            /*Here i must be a prime. consider Prime factorization 
              x = p1^q1 * p2^q2 * p3^q3...(p1<p2<p3...)
              the first number that satisfied x % i == 0 must be p1, it's prime!
              and p2 > p1 so I can continue to enumerate i, don't need to reset i to 2.
              curX = x/(p1^q1 * p2^q2 * ... * pj^qj) and i = p[j+1]
             */
            curX /= i, mx = max(i, mx);
        }
    }
    return max(mx, curX);
}

int main()
{
    int n;
    scanf("%d", &n);
    //I suppose n is positive
    if(n == 1) //1 is not prime
        printf("No solution\n");
    else
        printf("%d\n", maxPrime(n));
    return 0;
}

此代码达到最差运行时间O(Sqrt(n))

你的代码是错的,因为当n是素数时,你的代码无法得到正确的答案。

你的代码效率不高。

如果您想要更快的代码,您可以学习Pollard Rho或SQUFOF。