Count primes that can be expressed as sum of two consecutive primes and 1
Last Updated :
02 Nov, 2021
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++
#include <bits/stdc++.h>
using namespace std;
#define N 100005
bool isprime[N];
bool can[N];
vector< int > SieveOfEratosthenes()
{
memset (isprime, true , sizeof (isprime));
for ( int p = 2; p * p < N; p++) {
if (isprime[p] == true ) {
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;
}
int Prime_Numbers( int n)
{
vector< int > primes = SieveOfEratosthenes();
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;
}
int main()
{
int n = 50;
cout << Prime_Numbers(n);
return 0;
}
|
Java
import java.util.*;
class GfG
{
static int N = 100005 ;
static boolean isprime[] = new boolean [N];
static boolean can[] = new boolean [N];
static ArrayList<Integer>SieveOfEratosthenes()
{
for ( int a = 0 ; a < isprime.length; a++)
{
isprime[a] = true ;
}
for ( int p = 2 ; p * p < N; p++)
{
if (isprime[p] == true )
{
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;
}
static int Prime_Numbers( int n)
{
ArrayList<Integer> primes = SieveOfEratosthenes();
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;
}
public static void main(String[] args)
{
int n = 50 ;
System.out.println(Prime_Numbers(n));
}
}
|
Python3
from math import sqrt;
N = 100005 ;
isprime = [ True ] * N;
can = [ False ] * N;
def SieveOfEratosthenes() :
for p in range ( 2 , int (sqrt(N)) + 1 ) :
if (isprime[p] = = True ) :
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;
def Prime_Numbers(n) :
primes = SieveOfEratosthenes();
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;
if __name__ = = "__main__" :
n = 50 ;
print (Prime_Numbers(n));
|
C#
using System;
using System.Collections;
class GfG
{
static int N = 100005;
static bool [] isprime = new bool [N];
static bool [] can = new bool [N];
static ArrayList SieveOfEratosthenes()
{
for ( int a = 0 ; a < N; a++)
{
isprime[a] = true ;
}
for ( int p = 2; p * p < N; p++)
{
if (isprime[p] == true )
{
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;
}
static int Prime_Numbers( int n)
{
ArrayList primes = SieveOfEratosthenes();
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;
}
static void Main()
{
int n = 50;
Console.WriteLine(Prime_Numbers(n));
}
}
|
PHP
<?php
$N = 10005;
$isprime = array_fill (0, $N , true);
$can = array_fill (0, $N , false);
function SieveOfEratosthenes()
{
global $N , $isprime ;
for ( $p = 2; $p * $p < $N ; $p ++)
{
if ( $isprime [ $p ] == true)
{
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 Prime_Numbers( $n )
{
global $N , $can , $isprime ;
$primes = SieveOfEratosthenes();
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 ;
}
$n = 50;
echo Prime_Numbers( $n );
?>
|
Javascript
<script>
let N = 10005;
let isprime = new Array(N).fill( true );
let can = new Array(N).fill( false );
function SieveOfEratosthenes()
{
for (let p = 2; p * p < N; p++)
{
if (isprime[p] == true )
{
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 Prime_Numbers(n)
{
let primes = SieveOfEratosthenes();
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;
}
let n = 50;
document.write(Prime_Numbers(n));
</script>
|
Time Complexity: O(N log (log N))
Auxiliary Space: O(100005)
Share your thoughts in the comments
Please Login to comment...