ปัญหา
เราต้องเขียนฟังก์ชัน JavaScript ที่รับตัวเลข gap เป็นอาร์กิวเมนต์แรก และช่วงอาร์เรย์สองตัวเลขเป็นอาร์กิวเมนต์ที่สอง ฟังก์ชันควรคืนค่าอาร์เรย์ของคู่จำนวนเฉพาะทั้งหมด ที่มีความต่างสัมบูรณ์เท่ากับ gap และอยู่ในช่วงที่กำหนด
ตัวอย่าง
โค้ดตัวอย่างด้านล่าง:
const gap = 4;
const range = [20, 200];
const primesInRange = (gap, [left, right]) => {
const isPrime = num => {
for (let i = 2; i < num; i++) {
if (num % i === 0) {
return false;
}
}
return true;
};
const primes = [];
const res = [];
for (let i = left; i < right; i++) {
if (isPrime(i)) {
primes.push(i);
}
}
let currentNum = primes[0];
for (let j = 1; j < primes.length; j++) {
if (primes[j] - currentNum === gap) {
res.push(currentNum, primes[j]);
return res;
} else {
currentNum = primes[j];
}
}
return null;
};
console.log(primesInRange(gap, range));
ผลลัพธ์
[37, 41]
คำอธิบายเพิ่มเติม
โค้ดหาจำนวนเฉพาะในช่วงด้วย trial division (ช้า) แล้วหาคู่ที่ต่างกัน gap แค่คู่แรก (return ทันที) ควรใช้ Sieve of Eratosthenes และเก็บทุกคู่ ไม่ใช่แค่คู่แรก