📜  左截断素数

📅  最后修改于: 2021-04-23 20:45:55             🧑  作者: Mango

左截断的质数是在给定基数(例如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