我正在尝试解决教育网站平台上的问题。 这是任务/问题:
编写一个程序,查找并打印最大的素数
<= 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);
那么,如何解决这个问题呢? 你能提供更快的逻辑/算法
吗?答案 0 :(得分:0)
假设您正在寻找仅在给定范围内的最大素数(2 <= N <= 10 000 000),&#34;简单&#34;方法可能实际上更快,因为在低于10 000 000的素数中的价差低得令人满意(因此,i-loop不会做很多轮换,免责声明:这将不一定为真所有范围)。
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;