Given a number N. The task is to count the number of prime numbers from 2 to N that can be expressed as a sum of two consecutive primes and 1.
Examples:
Input: N = 27
Output: 2
13 = 5 + 7 + 1 and 19 = 7 + 11 + 1 are the required prime numbers.
Input: N = 34
Output: 3
13 = 5 + 7 + 1, 19 = 7 + 11 + 1 and 31 = 13 + 17 + 1.
Approach: An efficient approach is to find all the primes numbers up to N using Sieve of Eratosthenes and place all the prime numbers in a vector. Now, run a simple loop and add two consecutive primes and 1 then check if this sum is also a prime. If it is then increment the count.
Below is the implementation of the above approach:
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std;
#define N 100005 // To check if a number is prime or not bool isprime[N];
// To store possible numbers bool can[N];
// Function to return all prime numbers vector< int > SieveOfEratosthenes()
{ memset (isprime, true , sizeof (isprime));
for ( int p = 2; p * p < N; p++) {
// If prime[p] is not changed, then it is a prime
if (isprime[p] == true ) {
// Update all multiples of p greater than or
// equal to the square of it
// numbers which are multiple of p and are
// less than p^2 are already been marked.
for ( int i = p * p; i < N; i += p)
isprime[i] = false ;
}
}
vector< int > primes;
for ( int i = 2; i < N; i++)
if (isprime[i])
primes.push_back(i);
return primes;
} // Function to count all possible prime numbers that can be // expressed as the sum of two consecutive primes and one int Prime_Numbers( int n)
{ vector< int > primes = SieveOfEratosthenes();
// All possible prime numbers below N
for ( int i = 0; i < ( int )(primes.size()) - 1; i++)
if (primes[i] + primes[i + 1] + 1 < N)
can[primes[i] + primes[i + 1] + 1] = true ;
int ans = 0;
for ( int i = 2; i <= n; i++) {
if (can[i] and isprime[i]) {
ans++;
}
}
return ans;
} // Driver code int main()
{ int n = 50;
cout << Prime_Numbers(n);
return 0;
} |
// Java implementation of the approach import java.util.*;
class GfG
{ static int N = 100005 ;
// To check if a number is prime or not static boolean isprime[] = new boolean [N];
// To store possible numbers static boolean can[] = new boolean [N];
// Function to return all prime numbers static ArrayList<Integer>SieveOfEratosthenes()
{ for ( int a = 0 ; a < isprime.length; a++)
{
isprime[a] = true ;
}
for ( int p = 2 ; p * p < N; p++)
{
// If prime[p] is not changed, then it is a prime
if (isprime[p] == true )
{
// Update all multiples of p greater than or
// equal to the square of it
// numbers which are multiple of p and are
// less than p^2 are already been marked.
for ( int i = p * p; i < N; i += p)
isprime[i] = false ;
}
}
ArrayList<Integer> primes = new ArrayList<Integer> ();
for ( int i = 2 ; i < N; i++)
if (isprime[i])
primes.add(i);
return primes;
} // Function to count all possible prime numbers that can be // expressed as the sum of two consecutive primes and one static int Prime_Numbers( int n)
{ ArrayList<Integer> primes = SieveOfEratosthenes();
// All possible prime numbers below N
for ( int i = 0 ; i < ( int )(primes.size()) - 1 ; i++)
if (primes.get(i) + primes.get(i + 1 ) + 1 < N)
can[primes.get(i) + primes.get(i + 1 ) + 1 ] = true ;
int ans = 0 ;
for ( int i = 2 ; i <= n; i++)
{
if (can[i] && isprime[i] == true )
{
ans++;
}
}
return ans;
} // Driver code public static void main(String[] args)
{ int n = 50 ;
System.out.println(Prime_Numbers(n));
} } // This code is contributed by // Prerna Saini. |
# Python3 implementation of the approach from math import sqrt;
N = 100005 ;
# To check if a number is prime or not isprime = [ True ] * N;
# To store possible numbers can = [ False ] * N;
# Function to return all prime numbers def SieveOfEratosthenes() :
for p in range ( 2 , int (sqrt(N)) + 1 ) :
# If prime[p] is not changed,
# then it is a prime
if (isprime[p] = = True ) :
# Update all multiples of p greater
# than or equal to the square of it
# numbers which are multiple of p and are
# less than p^2 are already been marked.
for i in range (p * p, N , p) :
isprime[i] = False ;
primes = [];
for i in range ( 2 , N) :
if (isprime[i]):
primes.append(i);
return primes;
# Function to count all possible prime numbers # that can be expressed as the sum of two # consecutive primes and one def Prime_Numbers(n) :
primes = SieveOfEratosthenes();
# All possible prime numbers below N
for i in range ( len (primes) - 1 ) :
if (primes[i] + primes[i + 1 ] + 1 < N) :
can[primes[i] + primes[i + 1 ] + 1 ] = True ;
ans = 0 ;
for i in range ( 2 , n + 1 ) :
if (can[i] and isprime[i]) :
ans + = 1 ;
return ans;
# Driver code if __name__ = = "__main__" :
n = 50 ;
print (Prime_Numbers(n));
# This code is contributed by Ryuga |
// C# implementation of the approach using System;
using System.Collections;
class GfG
{ static int N = 100005;
// To check if a number is prime or not static bool [] isprime = new bool [N];
// To store possible numbers static bool [] can = new bool [N];
// Function to return all prime numbers static ArrayList SieveOfEratosthenes()
{ for ( int a = 0 ; a < N; a++)
{
isprime[a] = true ;
}
for ( int p = 2; p * p < N; p++)
{
// If prime[p] is not changed, then it is a prime
if (isprime[p] == true )
{
// Update all multiples of p greater than or
// equal to the square of it
// numbers which are multiple of p and are
// less than p^2 are already been marked.
for ( int i = p * p; i < N; i += p)
isprime[i] = false ;
}
}
ArrayList primes = new ArrayList();
for ( int i = 2; i < N; i++)
if (isprime[i])
primes.Add(i);
return primes;
} // Function to count all possible prime numbers that can be // expressed as the sum of two consecutive primes and one static int Prime_Numbers( int n)
{ ArrayList primes = SieveOfEratosthenes();
// All possible prime numbers below N
for ( int i = 0; i < primes.Count - 1; i++)
if (( int )primes[i] + ( int )primes[i + 1] + 1 < N)
can[( int )primes[i] + ( int )primes[i + 1] + 1] = true ;
int ans = 0;
for ( int i = 2; i <= n; i++)
{
if (can[i] && isprime[i] == true )
{
ans++;
}
}
return ans;
} // Driver code static void Main()
{ int n = 50;
Console.WriteLine(Prime_Numbers(n));
} } // This code is contributed by mits |
<?php // PHP implementation of the approach $N = 10005;
// To check if a number is prime or not $isprime = array_fill (0, $N , true);
// To store possible numbers $can = array_fill (0, $N , false);
// Function to return all prime numbers function SieveOfEratosthenes()
{ global $N , $isprime ;
for ( $p = 2; $p * $p < $N ; $p ++)
{
// If prime[p] is not changed,
// then it is a prime
if ( $isprime [ $p ] == true)
{
// Update all multiples of p greater
// than or equal to the square of it
// numbers which are multiple of p and are
// less than p^2 are already been marked.
for ( $i = $p * $p ; $i < $N ; $i += $p )
$isprime [ $i ] = false;
}
}
$primes = array ();
for ( $i = 2; $i < $N ; $i ++)
if ( $isprime [ $i ])
array_push ( $primes , $i );
return $primes ;
} // Function to count all possible prime numbers // that can be expressed as the sum of two // consecutive primes and one function Prime_Numbers( $n )
{ global $N , $can , $isprime ;
$primes = SieveOfEratosthenes();
// All possible prime numbers below N
for ( $i = 0; $i < count ( $primes ) - 1; $i ++)
if ( $primes [ $i ] + $primes [ $i + 1] + 1 < $N )
$can [ $primes [ $i ] + $primes [ $i + 1] + 1] = true;
$ans = 0;
for ( $i = 2; $i <= $n ; $i ++)
{
if ( $can [ $i ] and $isprime [ $i ])
{
$ans ++;
}
}
return $ans ;
} // Driver code $n = 50;
echo Prime_Numbers( $n );
// This code is contributed by mits ?> |
<script> // JavaScript implementation of the approach let N = 10005; // To check if a number is prime or not let isprime = new Array(N).fill( true );
// To store possible numbers let can = new Array(N).fill( false );
// Function to return all prime numbers function SieveOfEratosthenes()
{ for (let p = 2; p * p < N; p++)
{
// If prime[p] is not changed,
// then it is a prime
if (isprime[p] == true )
{
// Update all multiples of p greater
// than or equal to the square of it
// numbers which are multiple of p and are
// less than p^2 are already been marked.
for (let i = p * p; i < N; i += p)
isprime[i] = false ;
}
}
let primes = new Array();
for (let i = 2; i < N; i++)
if (isprime[i])
primes.push(i);
return primes;
} // Function to count all possible prime numbers // that can be expressed as the sum of two // consecutive primes and one function Prime_Numbers(n)
{ let primes = SieveOfEratosthenes();
// All possible prime numbers below N
for (let i = 0; i < primes.length - 1; i++)
if (primes[i] + primes[i + 1] + 1 < N)
can[primes[i] + primes[i + 1] + 1] = true ;
let ans = 0;
for (let i = 2; i <= n; i++)
{
if (can[i] && isprime[i])
{
ans++;
}
}
return ans;
} // Driver code let n = 50; document.write(Prime_Numbers(n)); // This code is contributed by gfgking </script> |
5
Time Complexity: O(N log (log N))
Auxiliary Space: O(100005)