📜  如何解决质数上的 JavaScript 堆内存不足?

📅  最后修改于: 2022-05-13 01:56:45.788000             🧑  作者: Mango

如何解决质数上的 JavaScript 堆内存不足?

JavaScript 是一种高级的、动态类型的面向对象编程语言。当程序超出可用内存并导致溢出时,会引发“内存不足”错误。它也可能是由于对象太长或需要的内存大于分配的内存造成的。由于 JavaScript 中的一切都是对象,并且对象存储在堆中,因此我们在执行 JavaScript 程序时经常会遇到“堆内存不足”的错误。

让我们举一个非常常见的程序示例,该程序确定大数的素因子,例如 10^9 阶。克服内存泄漏问题的方法是使用一种算法,该算法不需要循环到数字的末尾来找到素因数。

算法:函数primeFactors()接受一个参数num ,它是要分解的原始数字。声明了一个空数组,它将存储主要因子。外部for循环从i=2循环到i=sqrt(num) 。如果该数字除以i的当前值,则将i的当前值推入数组。由于我们只关心找到不同的素因子,因此我们首先将因子推入数组,然后继续将数字除以i直到它不再可整除,然后它以num的减小值打破while循环。 for循环完成并检查num的最终值。如果num的值大于 2,则它是最大的素因数,并被推入数组。

示例 1:

Javascript
function primeFactors(num) {
    var prime = [];
    for (i = 2; i * i <= num; ++i) {
        if (num % i === 0) {
  
            // Prime factor found 
            prime.push(i);
            while (num % i === 0) {
                num /= i;
            }
        }
    }
    if (num > 2) {
  
        // Largest prime factor
        prime.push(num);
    }
    return prime;
}
  
console.log(primeFactors(992474117));


Javascript
function primeFactors(num) {
    var prime = [];
    for (i = 2; i * i <= num; ++i) {
        if (num % i === 0) {
            // prime factor found
            prime.push(i);
            while (num % i === 0) {
                num /= i;
            }
        }
    }
    if (num > 2) {
  
        //largest prime factor
        prime.push(num);
    }
    return prime;
}
console.log(primeFactors(1000000000000000000));


输出:

[ 23719, 41843 ]

概括:

  1. 数量=992474117
  2. 已声明素数数组
  3. for 循环从i=2运行到i=31503
  4. i=23719num除以rem=0并且 23719 也是质数,
    因此它被推入数组。
  5. num/i = 41843因此num= 41843也是一个不能被任何数整除的素数
    的范围内
  6. num>2并且是最大的素数,因此它被推入数组。

示例 2:

Javascript

function primeFactors(num) {
    var prime = [];
    for (i = 2; i * i <= num; ++i) {
        if (num % i === 0) {
            // prime factor found
            prime.push(i);
            while (num % i === 0) {
                num /= i;
            }
        }
    }
    if (num > 2) {
  
        //largest prime factor
        prime.push(num);
    }
    return prime;
}
console.log(primeFactors(1000000000000000000));

输出:

[ 2, 5 ]

概括:

  1. num=1000000000000000000是偶数,可以被 2 整除。
  2. 2 被推入数组,我们不断将num的当前值除以 2,直到它不再可整除。
  3. 遍历i的范围,下一个质数是 5,它被推入数组。
  4. for循环num=0完成后,所有质因数都已存储。