📜  酋长号码

📅  最后修改于: 2021-05-07 10:01:37             🧑  作者: Mango

Emirp是向后拼写的“素数”一词,它是指素数,当您反转其数字时,它会变成新的素数。 Emirps不包含回文质数(例如151或787),也不包含1位数的质数,例如7、107、113、149和157。资料来源:维基

emirp数

给定数字n,任务是打印所有小于或等于n的Emrip。
例子 :

Input  : n = 40
Output : 13 31 

Input  : n = 100
Output : 13 31 17 71 37 73 79 97

步骤如下:
1)使用Eratosthenes筛子生成所有小于或等于n的素数。我们也可以使用sundaram的筛子。
2)遍历所有生成的质数。对于每个遍历的质数,如果满足以下条件,则打印该数字及其反面。
………….a)如果反向也为素数。
………….b)逆向与素数不同(不允许回文)
………….c)反向小于或等于n。
以下是上述想法的实现。

C++
// Program to print Emirp numbers less than n
#include 
using namespace std;
 
// Function to find reverse of any number
int reverse(int x)
{
    int rev = 0;
    while (x > 0)
    {
        rev = (rev*10) + x%10;
        x = x/10;
    }
    return rev;
}
 
// Sieve method used for generating emirp number
// (use of sieve of Eratosthenes)
void printEmirp(int n)
{
    // Create a boolean array "prime[0..n]" and initialize
    // all entries it as true. A value in prime[i] will
    // finally be false if i is Not a prime, else true.
    bool prime[n+1];
    memset(prime, true, sizeof(prime));
 
    for (int p=2; p*p<=n; p++)
    {
        // If prime[p] is not changed, then it is a prime
        if (prime[p] == true)
        {
            // Update all multiples of p
            for (int i=p*2; i<=n; i += p)
                prime[i] = false;
        }
    }
 
    // Traverse all prime numbers
    for (int p=2; p<=n; p++)
    {
        if (prime[p])
        {
            // Find reverse a number
            int rev = reverse(p);
 
            // A number is emrip if it is not a palindrome
            // number and its reverse is also prime.
            if (p != rev && rev <= n && prime[rev])
            {
               cout << p << " " << rev << " ";
 
               // Mark reverse prime as false so that it's
               // not printed again
               prime[rev] = false;
            }
        }
    }
}
 
// Driver program
int main()
{
    int n = 40;
    printEmirp(n);
    return 0;
}


Java
// Java program to print Emirp
// numbers less than n
import java.util.Arrays;
 
class GFG
{
    // Function to find reverse of any number
    static int reverse(int x)
    {
        int rev = 0;
        while (x > 0)
        {
            rev = (rev * 10) + x % 10;
            x = x / 10;
        }
        return rev;
    }
     
    // Sieve method used for generating emirp number
    // (use of sieve of Eratosthenes)
    static void printEmirp(int n)
    {
        // Create a boolean array "prime[0..n]" and initialize
        // all entries it as true. A value in prime[i] will
        // finally be false if i is Not a prime, else true.
        boolean prime[]=new boolean[n + 1];
        Arrays.fill(prime,true);
     
        for (int p = 2; p * p <= n; p++)
        {
            // If prime[p] is not changed, then it is a prime
            if (prime[p] == true)
            {
                // Update all multiples of p
                for (int i = p * 2; i <= n; i += p)
                    prime[i] = false;
            }
        }
     
        // Traverse all prime numbers
        for (int p = 2; p <= n; p++)
        {
            if (prime[p])
            {
                // Find reverse a number
                int rev = reverse(p);
     
                // A number is emrip if it is not a palindrome
                // number and its reverse is also prime.
                if (p != rev && rev <= n && prime[rev])
                {
                    System.out.print(p + " " + rev + " ");
         
                    // Mark reverse prime as false so that it's
                    // not printed again
                    prime[rev] = false;
                }
            }
        }
    }
     
    // Driver code
    public static void main (String[] args)
    {
        int n = 100;
        printEmirp(n);
    }
}
 
// This code is contributed by Anant Agarwal.


Python3
# Program to print Emirp numbers
# less than n
 
# Function to find reverse
# of any number
def reverse(x):
 
    rev = 0;
    while (x > 0):
        rev = (rev * 10) + x % 10;
        x = int(x / 10);
 
    return rev;
 
# Sieve method used for generating
# emirp number(use of sieve of
# Eratosthenes)
def printEmirp(n):
 
    # Create a boolean array "prime[0..n]"
    # and initialize all entries it as true.
    # A value in prime[i] will finally be
    # false if i is Not a prime, else true.
    prime = [1] * (n + 1);
    p = 2;
    while (p * p <= n):
         
        # If prime[p] is not changed,
        # then it is a prime
        if (prime[p] == 1):
             
            # Update all multiples of p
            for i in range(p * 2, n + 1, p):
                prime[i] = 0;
        p += 1;
 
    # Traverse all prime numbers
    for p in range(2, n + 1):
        if (prime[p] == 1):
             
            # Find reverse a number
            rev = reverse(p);
 
            # A number is emrip if it is not
            # a palindrome number and its
            # reverse is also prime.
            if (p != rev and rev <= n and
                       prime[rev] == 1):
                print(p, rev, end = " ");
     
                # Mark reverse prime as
                # false so that it's
                # not printed again
                prime[rev] = 0;
 
# Driver Code
n = 100;
printEmirp(n);
 
# This code is contributed by mits


C#
// C# program to print Emirp
// numbers less than n
using System;
 
class GFG
{
    // Function to find
    // reverse of any number
    static int reverse(int x)
    {
        int rev = 0;
        while (x > 0)
        {
            rev = (rev * 10) + x % 10;
            x = x / 10;
        }
        return rev;
    }
     
    // Sieve method used for
    // generating emirp number
    // (use of sieve of Eratosthenes)
    static void printEmirp(int n)
    {
        // Create a boolean array
        // "prime[0..n]" and initialize
        // all entries it as true. A value
        // in prime[i] will finally be false 
        // if i is Not a prime, else true.
        bool []prime = new bool[n + 1];
        for(int i = 0; i < n + 1; i++)
        prime[i] = true;
     
     
        for (int p = 2; p * p <= n; p++)
        {
            // If prime[p] is not changed,
            // then it is a prime
            if (prime[p] == true)
            {
                // Update all multiples of p
                for (int i = p * 2; i <= n; i += p)
                    prime[i] = false;
            }
        }
     
        // Traverse all prime numbers
        for (int p = 2; p <= n; p++)
        {
            if (prime[p])
            {
                // Find reverse a number
                int rev = reverse(p);
     
                // A number is emrip if it
                // is not a palindrome number
                // and its reverse is also prime.
                if (p != rev && rev <= n && prime[rev])
                {
                    Console.Write(p + " " + rev + " ");
         
                    // Mark reverse prime as false
                    // so that it's not printed again
                    prime[rev] = false;
                }
            }
        }
    }
     
    // Driver code
    public static void Main ()
    {
        int n = 100;
        printEmirp(n);
    }
}
 
// This code is contributed by nitin mittal.


PHP
 0)
    {
         $rev = ($rev  * 10) + $x % 10;
        $x = (int)($x / 10);
    }
    return $rev;
}
 
// Sieve method used for generating
// emirp number(use of sieve of
// Eratosthenes)
function printEmirp($n)
{
    // Create a boolean array "prime[0..n]"
    // and initialize all entries it as true.
    // A value in prime[i] will finally be
    // false if i is Not a prime, else true.
    $prime = array_fill(0, ($n + 1), 1);
 
    for ($p = 2; $p * $p <= $n; $p++)
    {
        // If prime[p] is not changed,
        // then it is a prime
        if ($prime[$p] == 1)
        {
            // Update all multiples of p
            for ($i = $p * 2; $i <= $n; $i += $p)
                $prime[$i] = 0;
        }
    }
 
    // Traverse all prime numbers
    for ($p = 2; $p <= $n; $p++)
    {
        if ($prime[$p] == 1)
        {
            // Find reverse a number
            $rev = reverse($p);
 
            // A number is emrip if it is not
            // a palindrome number and its
            // reverse is also prime.
            if ($p != $rev && $rev <= $n &&
                $prime[$rev] == 1)
            {
                echo $p . " " . $rev . " ";
     
                // Mark reverse prime as
                // false so that it's
                // not printed again
                $prime[$rev] = 0;
            }
        }
    }
}
 
// Driver Code
$n = 100;
printEmirp($n);
 
// This code is contributed by mits
?>


Javascript


输出 :

13 31 17 71 37 73 79 97