可右截断的素数是素数,当最后一个(“右”)位数字被连续删除时,素数保持素数。例如,239是可右截断的素数,因为239、23和2都是素数。有83个右截号素数。
任务是检查给定的数字(N> 0)是否为可正确截短的素数。
例子:
Input: 239
Output: Yes
Input: 101
Output: No
101 is not right-truncatable prime because
numbers formed are 101, 10 and 1. Here, 101
is prime but 10 and 1 are not prime.
这个想法是使用Eratosthenes筛子生成所有小于或等于给定数N的素数。一旦生成了所有这样的质数,然后检查当最后一个(“正确”)数字被连续删除时,数字是否仍为质数。
C++
// Program to check
// whether a given number
// is right-truncatable
// prime or not.
#include
using namespace std;
// Generate all prime numbers less than n.
bool sieveOfEratosthenes(int n, bool isPrime[])
{
// Initialize all entries
// of boolean array as
// true. A value in
// isPrime[i] will finally
// be false if i is Not a
// prime, else true
// bool isPrime[n+1];
isPrime[0] = isPrime[1] = false;
for( int i = 2; i <= n; i++)
isPrime[i] = true;
for (int p = 2; p * p<=n; p++)
{
// If isPrime[p] is not changed, then it is
// a prime
if (isPrime[p] == true)
{
// Update all multiples of p
for (int i = p * 2; i <= n; i += p)
isPrime[i] = false;
}
}
}
// Returns true if n is right-truncatable,
// else false
bool rightTruPrime(int n)
{
// Generating primes using Sieve
bool isPrime[n+1];
sieveOfEratosthenes(n, isPrime);
// Checking whether the number remains
// prime when the last ("right")
// digit is successively removed
while (n)
{
if (isPrime[n])
n = n / 10;
else
return false;
}
return true;
}
// Driver program
int main()
{
int n = 59399;
if (rightTruPrime(n))
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}
Java
// Java code to check
// right-truncatable
// prime or not.
import java.io.*;
class GFG {
// Generate all prime
// numbers less than n.
static void sieveOfEratosthenes
(int n, boolean isPrime[])
{
// Initialize all entries of
// boolean array as true. A
// value in isPrime[i] will
// finally be false if i is
// Not a prime, else true
// bool isPrime[n+1];
isPrime[0] = isPrime[1] = false;
for (int i = 2; i <= n; i++)
isPrime[i] = true;
for (int p=2; p*p<=n; p++)
{
// If isPrime[p] is not
// changed, then it
// is a prime
if (isPrime[p] == true)
{
// Update all multiples of p
for (int i = p * 2; i <= n; i += p)
isPrime[i] = false;
}
}
}
// Returns true if n is
// right-truncatable,
// else false
static boolean rightTruPrime(int n)
{
// Generating primes using Sieve
boolean isPrime[] = new boolean[n+1];
sieveOfEratosthenes(n, isPrime);
// Checking whether the number
// remains prime when the last (right)
// digit is successively removed
while (n != 0)
{
if (isPrime[n])
n = n / 10;
else
return false;
}
return true;
}
// Driver program
public static void main(String args[])
{
int n = 59399;
if (rightTruPrime(n))
System.out.println("Yes");
else
System.out.println("No");
}
}
/* This code is contributed by Nikita Tiwari.*/
Python3
# Python3 Program to check
# whether a given number
# is right-truncatable
# prime or not.
# Generate all prime numbers less than n.
def sieveOfEratosthenes(n,isPrime) :
# Initialize all entries
# of boolean array as
# true. A value in isPrime[i]
# will finally be false if
# i is Not a prime, else true
# bool isPrime[n+1];
isPrime[0] = isPrime[1] = False
for i in range(2, n+1) :
isPrime[i] = True
p = 2
while(p * p <= n) :
# If isPrime[p] is not changed, then it is
# a prime
if (isPrime[p] == True) :
# Update all multiples of p
i = p * 2
while(i <= n) :
isPrime[i] = False
i = i + p
p = p + 1
# Returns true if n is right-truncatable, else false
def rightTruPrime(n) :
# Generating primes using Sieve
isPrime=[None] * (n+1)
sieveOfEratosthenes(n, isPrime)
# Checking whether the
# number remains prime
# when the last ("right")
# digit is successively
# removed
while (n != 0) :
if (isPrime[n]) :
n = n // 10
else :
return False
return True
# Driven program
n = 59399
if (rightTruPrime(n)) :
print("Yes")
else :
print("No")
# This code is contributed by Nikita Tiwari.
C#
// C# code to check right-
// truncatable prime or not
using System;
class GFG {
// Generate all prime
// numbers less than n.
static void sieveOfEratosthenes(int n, bool[] isPrime)
{
// Initialize all entries of
// boolean array as true. A
// value in isPrime[i] will
// finally be false if i is
// Not a prime, else true
// bool isPrime[n+1];
isPrime[0] = isPrime[1] = false;
for (int i = 2; i <= n; i++)
isPrime[i] = true;
for (int p = 2; p * p <= n; p++) {
// If isPrime[p] is not
// changed, then it
// is a prime
if (isPrime[p] == true) {
// Update all multiples of p
for (int i = p * 2; i <= n; i += p)
isPrime[i] = false;
}
}
}
// Returns true if n is right-
// truncatable, else false
static bool rightTruPrime(int n)
{
// Generating primes using Sieve
bool[] isPrime = new bool[n + 1];
sieveOfEratosthenes(n, isPrime);
// Checking whether the number
// remains prime when last (right)
// digit is successively removed
while (n != 0) {
if (isPrime[n])
n = n / 10;
else
return false;
}
return true;
}
// Driven program
public static void Main()
{
int n = 59399;
if (rightTruPrime(n))
Console.WriteLine("Yes");
else
Console.WriteLine("No");
}
}
// This code is contributed by Anant Agarwal
PHP
Javascript
输出:
Yes