可左截断的质数是在给定基数(例如10)中不包含0的质数,并且当连续删除前导(“左”)数字时仍保持质数。例如,由于317、17和7都是素数,所以317是左截断素数。共有4260个左截号素数。
任务是检查给定的数字(N> 0)是否为左截断素数。
例子:
Input: 317
Output: Yes
Input: 293
Output: No
293 is not left-truncatable prime because
numbers formed are 293, 93 and 3. Here, 293
and 3 are prime but 93 is not prime.
想法是首先检查数字是否包含0作为数字,并计数给定数字N中的位数。如果包含0,则返回false,否则使用生成小于或等于给定数字N的所有素数Eratosthenes筛子。一旦生成了所有这样的质数,然后检查当前导(“左”)数字被连续删除时,数字是否仍为质数。
下面是上述方法的实现。
C++
// Program to check whether a given number
// is left-truncatable prime or not.
#include
using namespace std;
/* Function to calculate x raised to the power y */
int power(int x, unsigned int y)
{
if (y == 0)
return 1;
else if (y%2 == 0)
return power(x, y/2)*power(x, y/2);
else
return x*power(x, y/2)*power(x, y/2);
}
// 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 leftTruPrime(int n)
{
int temp = n, cnt = 0, temp1;
// Counting number of digits in the
// input number and checking whether it
// contains 0 as digit or not.
while (temp)
{
cnt++; // counting number of digits.
temp1 = temp%10; // checking whether digit is 0 or not
if (temp1==0)
return false; // if digit is 0, return false.
temp = temp/10;
}
// Generating primes using Sieve
bool isPrime[n+1];
sieveOfEratosthenes(n, isPrime);
// Checking whether the number remains prime
// when the leading ("left") digit is successively
// removed
for (int i=cnt; i>0; i--)
{
// Checking number by successively removing
// leading ("left") digit.
/* n=113, cnt=3
i=3 mod=1000 n%mod=113
i=2 mod=100 n%mod=13
i=3 mod=10 n%mod=3 */
int mod= power(10,i);
if (!isPrime[n%mod]) // checking prime
return false; // if not prime, return false
}
return true; // if remains prime, return true
}
// Driver program
int main()
{
int n = 113;
if (leftTruPrime(n))
cout << n << " is left truncatable prime" << endl;
else
cout << n << " is not left truncatable prime" << endl;
return 0;
}
Java
// Program to check whether
// a given number is left
// truncatable prime or not.
import java.io.*;
class GFG {
// Function to calculate x
// raised to the power y
static int power(int x,int y)
{
if (y == 0)
return 1;
else if (y%2 == 0)
return power(x, y/2)
*power(x, y/2);
else
return x*power(x, y/2)
*power(x, y/2);
}
// 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 leftTruPrime(int n)
{
int temp = n, cnt = 0, temp1;
// Counting number of digits in the
// input number and checking whether
// it contains 0 as digit or not.
while (temp != 0)
{
// counting number of digits.
cnt++;
temp1 = temp%10;
// checking whether digit is
// 0 or not
if (temp1 == 0)
return false;
temp = temp/10;
}
// Generating primes using Sieve
boolean isPrime[] = new boolean[n+1];
sieveOfEratosthenes(n, isPrime);
// Checking whether the number
// remains prime when the leading
// ("left") digit is successively removed
for (int i = cnt; i > 0; i--)
{
// Checking number by successively
// removing leading ("left") digit.
/* n=113, cnt=3
i=3 mod=1000 n%mod=113
i=2 mod=100 n%mod=13
i=3 mod=10 n%mod=3 */
int mod = power(10,i);
if (!isPrime[n%mod])
return false;
}
// if remains prime, return true
return true;
}
// Driver program
public static void main(String args[])
{
int n = 113;
if (leftTruPrime(n))
System.out.println
(n+" is left truncatable prime");
else
System.out.println
(n+" is not left truncatable prime");
}
}
/*This code is contributed by Nikita Tiwari.*/
Python3
# Python3 Program to
# check whether a
# given number is left
# truncatable prime
# or not.
# Function to calculate
# x raised to the power y
def power(x, y) :
if (y == 0) :
return 1
elif (y % 2 == 0) :
return(power(x, y // 2) *
power(x, y // 2))
else :
return(x * power(x, y // 2) *
power(x, y // 2))
# 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 leftTruPrime(n) :
temp = n
cnt = 0
# Counting number of
# digits in the input
# number and checking
# whether it contains
# 0 as digit or not.
while (temp != 0) :
# counting number
# of digits.
cnt=cnt + 1
# checking whether
# digit is 0 or not
temp1 = temp % 10;
if (temp1 == 0) :
# if digit is 0,
# return false.
return False
temp = temp // 10
# Generating primes
# using Sieve
isPrime = [None] * (n + 1)
sieveOfEratosthenes(n, isPrime)
# Checking whether the
# number remains prime
# when the leading
# ("left") digit is
# successively removed
for i in range(cnt, 0, -1) :
# Checking number by
# successively removing
# leading ("left") digit.
# n=113, cnt=3
# i=3 mod=1000 n%mod=113
# i=2 mod=100 n%mod=13
# i=3 mod=10 n%mod=3
mod = power(10, i)
# checking prime
if (isPrime[n % mod] != True) :
# if not prime,
# return false
return False
# if remains prime
# , return true
return True
# Driver program
n = 113
if (leftTruPrime(n)) :
print(n, "is left truncatable prime")
else :
print(n, "is not left truncatable prime")
# This code is contributed by Nikita Tiwari.
C#
// Program to check whether
// a given number is left
// truncatable prime or not.
using System;
class GFG {
// Function to calculate x
// raised to the power y
static int power(int x, int y)
{
if (y == 0)
return 1;
else if (y%2 == 0)
return power(x, y/2)
*power(x, y/2);
else
return x*power(x, y/2)
*power(x, y/2);
}
// 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 leftTruPrime(int n)
{
int temp = n, cnt = 0, temp1;
// Counting number of digits in the
// input number and checking whether
// it contains 0 as digit or not.
while (temp != 0)
{
// counting number of digits.
cnt++;
temp1 = temp%10;
// checking whether digit is
// 0 or not
if (temp1 == 0)
return false;
temp = temp/10;
}
// Generating primes using Sieve
bool []isPrime = new bool[n+1];
sieveOfEratosthenes(n, isPrime);
// Checking whether the number
// remains prime when the leading
// ("left") digit is successively removed
for (int i = cnt; i > 0; i--)
{
// Checking number by successively
// removing leading ("left") digit.
/* n=113, cnt=3
i=3 mod=1000 n%mod=113
i=2 mod=100 n%mod=13
i=3 mod=10 n%mod=3 */
int mod = power(10, i);
if (!isPrime[n%mod])
return false;
}
// if remains prime, return true
return true;
}
// Driver program
public static void Main()
{
int n = 113;
if (leftTruPrime(n))
Console.WriteLine
(n + " is left truncatable prime");
else
Console.WriteLine
(n + " is not left truncatable prime");
}
}
//This code is contributed by Anant Agarwal.
PHP
0; $i--)
{
// Checking number by
// successively removing
// leading ("left") digit.
/* n=113, cnt=3
i=3 mod=1000 n%mod=113
i=2 mod=100 n%mod=13
i=3 mod=10 n%mod=3 */
$mod= power(10, $i);
// checking prime
if (!$isPrime[$n % $mod])
// if not prime, return
// false
return -1;
}
// if remains prime, return true
return true;
}
// Driver program
$n = 113;
if (leftTruPrime($n))
echo $n, " is left truncatable",
" prime", "\n";
else
echo $n, " is not left ",
"truncatable prime", "\n";
// This code is contributed by ajit
?>
输出:
113 is left truncatable prime
最坏情况的复杂度: O(N * N)
相关文章:
右截断素数
参考: https : //en.wikipedia.org/wiki/Truncatable_prime