สมมติว่าเรามีตัวเลข n เราต้องหาจำนวนเฉพาะพิเศษที่ใหญ่ที่สุดซึ่งน้อยกว่าหรือเท่ากับ N จำนวนเฉพาะพิเศษคือตัวเลข ซึ่งสามารถสร้างขึ้นได้โดยการวางตัวเลขทีละตัว ดังนั้นจำนวนผลลัพธ์ทั้งหมดจึงเป็นจำนวนเฉพาะ
เราจะใช้ Sieve Of Eratosthenes เราจะสร้างอาร์เรย์ตะแกรงจนถึงจำนวน n จากนั้นเริ่มวนซ้ำจากตัวเลข N โดยตรวจสอบว่าตัวเลขนั้นเป็นจำนวนเฉพาะหรือไม่ เมื่อเป็นจำนวนเฉพาะ ให้ตรวจสอบว่านี่เป็นจำนวนเฉพาะพิเศษหรือไม่
ตัวอย่าง
#include<iostream>
using namespace std;
bool isSpecialPrime(bool sieve[], int num) {
while (num) {
if (!sieve[num]) {
return false;
}
num /= 10;
}
return true;
}
void findSpecialPrime(int N) {
bool sieve[N + 10];
for(int i = 0; i<N+10; i++){
sieve[i] = true;
}
sieve[0] = sieve[1] = false;
for (long long i = 2; i <= N; i++) {
if (sieve[i]) {
for (long long j = i * i; j <= N; j += i) {
sieve[j] = false;
}
}
}
while (true) {
if (isSpecialPrime(sieve, N)) {
cout << N << '\n';
break;
}
else
N--;
}
}
int main() {
cout << "Special prime in range (2 -> 400): ";
findSpecialPrime(400);
cout << "Special prime in range (2 -> 100): ";
findSpecialPrime(100);
} ผลลัพธ์
Special prime in range (2 -> 400): 379 Special prime in range (2 -> 100): 79