给定数字N。任务是找到大于或等于N的最小特殊质数。
特殊质数是一个数字,可以通过将数字一个接一个地放置来创建,这样所有产生的数字都是质数。
例子:
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
方法:想法是使用Eratosthenes筛。构造筛子阵列,直到数字N * 10(假设该数字在该范围内)。然后从数字N开始迭代检查数字是否为质数。如果是素数,请检查它是否是特殊素数。
现在,检查数字是否为特殊质数。继续将数字除以10,然后在每个点检查剩余的数字是否为质数,这可以通过引用已构建的Sieve数组来完成。
下面是上述方法的实现:
C++
// CPP program to find the Smallest Special Prime
// which is greater than or equal to a given number
#include
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;
}
Java
// Java program to find the Smallest Special Prime
// which is greater than or equal to a given number
class GFG
{
// Function to check whether the number
// is a special prime or not
static boolean checkSpecialPrime(boolean []sieve, int num)
{
// While number is not equal to zero
while (num > 0)
{
// 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
static void findSpecialPrime(int N)
{
boolean[] sieve = new boolean[N * 10 + 1];
// Initially all numbers are considered Primes.
sieve[0] = sieve[1] = true;
for (int i = 2; i <= N * 10; i++)
{
if (!sieve[i])
{
for (int j = i * i; j <= N * 10; j += i)
{
sieve[j] = true;
}
}
}
// 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.
System.out.println(N);
break;
}
// Else increment the number.
else
N++;
}
}
// Driver code
public static void main(String[] args)
{
int N = 379;
findSpecialPrime(N);
N = 100;
findSpecialPrime(N);
}
}
// This code contributed by Rajput-Ji
Python3
# Python 3 program to find the Smallest
# Special Prime which is greater than or
# equal to a given number
# Function to check whether the number
# is a special prime or not
def checkSpecialPrime(sieve, num):
# While number is not equal to zero
while (num):
# If the number is not prime
# return false.
if (sieve[num] == False):
return False
# Else remove the last digit
# by dividing the number by 10.
num = int(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
def findSpecialPrime(N):
sieve = [True for i in range(N * 10 + 1)]
sieve[0] = False
sieve[1] = False
# sieve for finding the Primes
for i in range(2, N * 10 + 1):
if (sieve[i]):
for j in range(i * i, N * 10 + 1, 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.
print(N)
break
# Else increment the number.
else:
N += 1
# Driver code
if __name__ == '__main__':
N = 379
findSpecialPrime(N)
N = 100
findSpecialPrime(N)
# This code is contributed by
# Surendra_Gangwar
C#
// C# program to find the Smallest Special Prime
// which is greater than or equal to a given number
using System;
class GFG
{
// Function to check whether the number
// is a special prime or not
static bool checkSpecialPrime(bool []sieve, int num)
{
// While number is not equal to zero
while (num > 0)
{
// 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
static void findSpecialPrime(int N)
{
bool[] sieve = new bool[N * 10 + 1];
// Initially all numbers are considered Primes.
sieve[0] = sieve[1] = true;
for (int i = 2; i <= N * 10; i++)
{
if (!sieve[i])
{
for (int j = i * i; j <= N * 10; j += i)
{
sieve[j] = true;
}
}
}
// 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.
Console.WriteLine(N);
break;
}
// Else increment the number.
else
N++;
}
}
// Driver code
static void Main()
{
int N = 379;
findSpecialPrime(N);
N = 100;
findSpecialPrime(N);
}
}
// This code is contributed by mits
PHP
Javascript
输出:
379
233