Given an integer N, the task is to print all the multiplicative primes ? N.
Multiplicative Primes are the primes such that the product of their digits is also a prime. For example; 2, 3, 7, 13, 17, …
Examples:
Input: N = 10
Output: 2 3 5 7
Input: N = 3
Output: 2 3
Approach: Using Sieve of Eratosthenes check for all the primes ? N whether they are multiplicative primes i.e. product of their digits is also a prime. If yes then print those multiplicative primes.
Algorithm:
Step 1: Define a function of the static type which will return the int value and take input as an integer number and return the product of its digits.
Step 2: Now Initialize the variable of in type called prod with the initial value 1.
Step 3: Start a while loop which will calculate the product of digits:
a. Multiply prod by the remainder of n divided by 10.
b. Divide n by 10 and update the value of n with the result.
c. Repeat until n becomes 0.
Step 4: Now return prod as the digit product of n
Step 5: Create a function called printMultiplicativePrimes that outputs all multiplicative primes up to n given an integer input of n.
Step 6: Set every value in the prime boolean array, which has a size of n+1, to true during initialization.
Step 7: primes [0] and [1] should be set to false because they are not primes.
Step 8: Get all primes up to the square root of n using a for loop and Update all multiples of p by setting prime[i] to false if prime[p] is true.
Step 9: Print all prime multiplicative numbers up to n using another for loop and Print I if both prime[i] and prime[digitProduct(i)] are true.
Below is the implementation of the above approach:
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std;
// Function to return the digit product of n int digitProduct( int n)
{ int prod = 1;
while (n) {
prod = prod * (n % 10);
n = n / 10;
}
return prod;
} // Function to print all multiplicative primes <= n void printMultiplicativePrimes( int n)
{ // Create a boolean array "prime[0..n+1]". 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));
prime[0] = prime[1] = false ;
for ( int p = 2; p * p <= n; p++) {
// If prime[p] is not changed, then
// it is a prime
if (prime[p]) {
// Update all multiples of p
for ( int i = p * 2; i <= n; i += p)
prime[i] = false ;
}
}
for ( int i = 2; i <= n; i++) {
// If i is prime and its digit sum is also prime
// i.e. i is a multiplicative prime
if (prime[i] && prime[digitProduct(i)])
cout << i << " " ;
}
} // Driver code int main()
{ int n = 10;
printMultiplicativePrimes(n);
} |
// Java implementation of the approach import java.io.*;
class GFG
{ // Function to return the digit product of n static int digitProduct( int n)
{ int prod = 1 ;
while (n > 0 )
{
prod = prod * (n % 10 );
n = n / 10 ;
}
return prod;
} // Function to print all multiplicative primes <= n static void printMultiplicativePrimes( int n)
{ // Create a boolean array "prime[0..n+1]". A
// value in prime[i] will finally be false
// if i is Not a prime, else true.
boolean prime[] = new boolean [n + 1 ];
for ( int i = 0 ; i <= n; i++)
prime[i] = true ;
prime[ 0 ] = prime[ 1 ] = false ;
for ( int p = 2 ; p * p <= n; p++)
{
// If prime[p] is not changed, then
// it is a prime
if (prime[p])
{
// Update all multiples of p
for ( int i = p * 2 ; i <= n; i += p)
prime[i] = false ;
}
}
for ( int i = 2 ; i <= n; i++)
{
// If i is prime and its digit sum is also prime
// i.e. i is a multiplicative prime
if (prime[i] && prime[digitProduct(i)])
System.out.print( i + " " );
}
} // Driver code
public static void main (String[] args)
{
int n = 10 ;
printMultiplicativePrimes(n);
}
} // This code is contributed by shs.. |
# Python 3 implementation of the approach from math import sqrt
# Function to return the digit product of n def digitProduct(n):
prod = 1
while (n):
prod = prod * (n % 10 )
n = int (n / 10 )
return prod
# Function to print all multiplicative # primes <= n def printMultiplicativePrimes(n):
# Create a boolean array "prime[0..n+1]".
# A value in prime[i] will finally be
# false if i is Not a prime, else true.
prime = [ True for i in range (n + 1 )]
prime[ 0 ] = prime[ 1 ] = False
for p in range ( 2 , int (sqrt(n)) + 1 , 1 ):
# If prime[p] is not changed,
# then it is a prime
if (prime[p]):
# Update all multiples of p
for i in range (p * 2 , n + 1 , p):
prime[i] = False
for i in range ( 2 , n + 1 , 1 ):
# If i is prime and its digit sum
# is also prime i.e. i is a
# multiplicative prime
if (prime[i] and prime[digitProduct(i)]):
print (i, end = " " )
# Driver code if __name__ = = '__main__' :
n = 10
printMultiplicativePrimes(n)
# This code is contributed by # Surendra_Gangwar |
// C# implementation of the approach class GFG
{ // Function to return the digit product of n static int digitProduct( int n)
{ int prod = 1;
while (n > 0)
{
prod = prod * (n % 10);
n = n / 10;
}
return prod;
} // Function to print all multiplicative primes <= n static void printMultiplicativePrimes( int n)
{ // Create a boolean array "prime[0..n+1]". 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; i++)
prime[i] = true ;
prime[0] = prime[1] = false ;
for ( int p = 2; p * p <= n; p++)
{
// If prime[p] is not changed, then
// it is a prime
if (prime[p])
{
// Update all multiples of p
for ( int i = p * 2; i <= n; i += p)
prime[i] = false ;
}
}
for ( int i = 2; i <= n; i++)
{
// If i is prime and its digit sum is also prime
// i.e. i is a multiplicative prime
if (prime[i] && prime[digitProduct(i)])
System.Console.Write( i + " " );
}
} // Driver code
static void Main()
{
int n = 10;
printMultiplicativePrimes(n);
}
} // This code is contributed by chandan_jnu |
<?php // PHP implementation of the approach // Function to return the digit product of n function digitProduct( $n )
{ $prod = 1;
while ( $n )
{
$prod = $prod * ( $n % 10);
$n = floor ( $n / 10);
}
return $prod ;
} // Function to print all multiplicative // primes <= n function printMultiplicativePrimes( $n )
{ // Create a boolean array "prime[0..n+1]".
// A value in prime[i] will finally be
// false if i is Not a prime, else true.
$prime = array_fill (0, $n + 1, true);
$prime [0] = $prime [1] = false;
for ( $p = 2; $p * $p <= $n ; $p ++)
{
// If prime[p] is not changed, then
// it is a prime
if ( $prime [ $p ])
{
// Update all multiples of p
for ( $i = $p * 2; $i <= $n ; $i += $p )
$prime [ $i ] = false;
}
}
for ( $i = 2; $i <= $n ; $i ++)
{
// If i is prime and its digit sum is also
// prime i.e. i is a multiplicative prime
if ( $prime [ $i ] && $prime [digitProduct( $i )])
echo $i , " " ;
}
} // Driver code $n = 10;
printMultiplicativePrimes( $n );
// This code is contributed by Ryuga. ?> |
<script> // Javascript implementation of the approach // Function to return the digit product of n
function digitProduct(n)
{
let prod = 1;
while (n > 0)
{
prod = prod * (n % 10);
n = Math.floor(n / 10);
}
return prod;
}
// Function to print all
// multiplicative primes <= n
function printMultiplicativePrimes(n)
{
// Create a boolean array "prime[0..n+1]". A
// value in prime[i] will finally be false
// if i is Not a prime, else true.
let prime = new Array(n + 1);
for (let i = 0; i <= n; i++)
prime[i] = true ;
prime[0] = prime[1] = false ;
for (let p = 2; p * p <= n; p++)
{
// If prime[p] is not changed, then
// it is a prime
if (prime[p])
{
// Update all multiples of p
for (let i = p * 2; i <= n; i += p)
prime[i] = false ;
}
}
for (let i = 2; i <= n; i++)
{
// If i is prime and its digit sum is also prime
// i.e. i is a multiplicative prime
if (prime[i] && prime[digitProduct(i)])
document.write( i + " " );
}
}
// Driver code
let n = 10;
printMultiplicativePrimes(n);
// This code is contributed by unknown2108
</script> |
2 3 5 7
Time Complexity: O(n3/2)
Auxiliary Space: O(n)