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