如何找到最大的素数

时间:2018-05-31 20:06:39

标签: javascript

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

  

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

     

输入

     

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

     

输出

     

打印最大素数&lt; = N

     

约束

     

2 <= N <= 10 000 000

     

实施例

     

如果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);

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

吗?

1 个答案:

答案 0 :(得分:0)

假设您正在寻找仅在给定范围内的最大素数(2 <= N <= 10 000 000),&#34;简单&#34;方法可能实际上更快,因为在低于10 000 000的素数中的价差低得令人满意(因此,i-loop不会做很多轮换,免责声明:这将不一定为真所有范围)。

&#13;
&#13;
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);
&#13;
&#13;
&#13;