Smallest Special Prime which is greater than or equal to a given number

Given a number N. The task is to find the smallest special prime which is greater than or equal to N.

A special prime is a number which can be created by placing digits one after another such the all the resulting numbers are prime.
Examples:

Input: N = 379
Output: 379
379 can be created as => 3 => 37 => 379
Here, all the numbers ie. 3, 37, 379 are prime.

Input:N = 100
Output: 233

Approach: The idea is to use Sieve Of Eratosthenes. Build the sieve array up to the number N*10 (Assuming the number will exist in that range). Then start iteratively from the number N checking if the number is prime. If it is prime then check if it is special prime or not.

Now, to check if a number is a special prime or not. Keep dividing the number by 10 and at each point check whether the remaining number is prime or not, which we can do by referring our Sieve array which we have built.

Below is the implementation of the above approach:

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find the Smallest Special Prime
// which is greater than or equal to a given number
#include <bits/stdc++.h>
using namespace std;
  
// Function to check whether the number
// is a special prime or not
bool checkSpecialPrime(bool* sieve, int num)
{
    // While number is not equal to zero
    while (num) {
        // If the number is not prime
        // return false.
        if (!sieve[num]) {
            return false;
        }
  
        // Else remove the last digit
        // by dividing the number by 10.
        num /= 10;
    }
  
    // If the number has become zero
    // then the number is special prime,
    // hence return true
    return true;
}
  
// Function to find the Smallest Special Prime
// which is greater than or equal to a given number
void findSpecialPrime(int N)
{
    bool sieve[N*10];
  
    // Initially all numbers are considered Primes.
    memset(sieve, true, sizeof(sieve));
    sieve[0] = sieve[1] = false;
    for (long long i = 2; i <= N*10; i++) {
        if (sieve[i]) {
  
            for (long long j = i * i; j <= N*10; j += i) {
                sieve[j] = false;
            }
        }
    }
  
    // There is always an answer possible
    while (true) {
        // Checking if the number is a
        // special prime or not
        if (checkSpecialPrime(sieve, N)) {
            // If yes print the number
            // and break the loop.
            cout << N << '\n';
            break;
        }
        // Else increment the number.
        else
            N++;
    }
}
  
// Driver code
int main()
{
    int N = 379;
  
    findSpecialPrime(N);
  
    N = 100;
    findSpecialPrime(N);
  
    return 0;
}

chevron_right


Output:

379
233


My Personal Notes arrow_drop_up