【问题标题】:How to find the biggest prime number如何找到最大的素数
【发布时间】:2018-06-01 15:12:34
【问题描述】:

我正在尝试解决教育网站平台上的问题。 这是任务/问题:

编写一个程序,找出并打印出最大的素数<= N

输入

在第一行,您将收到数字 N

输出

打印最大的质数

约束

2

示例

如果N=13,那么最大的素数也是13

如果N=126,那么最大的素数也是113

如果N=26,那么最大的素数也是23

这是我的代码,工作正常,但系统不接受它完全正确,因为我的代码很慢/超过了内存限制:

const inputnumber = theNumberN; // Comes dymanically from the system

function getPrimes(max) {
    let sieve = [];
    let primes = [];

    for (let i = 2; i <= max; ++i) {
        if (!sieve[i]) {
            primes.push(i);
            for (let j = i << 1; j <= max; j += i) {
                sieve[j] = true;
            }
        }
    }
    return primes;
}

let result = getPrimes(inputnumber);
let biggest = Math.max(...result);

console.log(biggest);

那么,如何解决呢? 你能提供更快的逻辑/算法吗

【问题讨论】:

  • 与其维护一个素数数组,不如只保留迄今为止发现的最大素数。这样做会占用更少的内存,并且不必对找到的所有素数进行最终迭代。
  • 如何反转 for 循环,从最大值开始,一直到 2 并在遇到质数时立即突破?
  • @ReverendDovie 他正在尝试实施埃拉托色尼筛法,这需要完善。
  • j &lt;= max 可以是j &lt;= Math.sqrt(max)

标签: javascript


【解决方案1】:

假设您要只查找给定范围内的最大素数(2 不一定适用于所有范围)。

function getBiggestPrime(max) {
    let sieve = [];
    let primes = [];
    for (let i = 2; i <= max; ++i) {
        if (!sieve[i]) {
            primes.push(i);
            for (let j = i << 1; j <= max; j += i) {
                sieve[j] = true;
            }
        }
    }
    return primes[primes.length - 1];
}

function getBiggestPrimeTwo(max){
    let biggestPrime = 1;
    for (let i = max; i >= 2; i--){
        let isPrime = true;
        for (let j = 2; j < i; j++){
            if (i % j == 0){ //break the loop, the number is not a prime
                isPrime = false;
                break;
            }
        }
        if (isPrime){
            biggestPrime = i;
            break;
        }
    }
    return biggestPrime;
}

function runTests(val, times){
    var t0, t1, res, testStep;
    testStep = val / times;
    t0 = performance.now();
    for (let i = 1; i <= times; i++){
        res = getBiggestPrime(testStep*i);
    }
    t1 = performance.now();
    console.log("Test1: " + res +  ", took: " + (t1-t0) + "msec"); 

    t0 = performance.now();
    for (let i = 1; i <= times; i++){
        res = getBiggestPrimeTwo(testStep*i);
    }
    t1 = performance.now();
    console.log("Test2: " + res +  ", took: " + (t1-t0) + "msec"); 
}

runTests(10000000, 50);

【讨论】:

  • 太棒了!谢了哥们! getBiggestPrimeTwo(max) 函数完美地完成了这项工作:)
猜你喜欢
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 2019-08-31
  • 2015-12-17
  • 1970-01-01
  • 2015-01-05
  • 2014-11-28
  • 2021-05-12
相关资源
最近更新 更多