Count of primes below N which can be expressed as the sum of two primes
Given an integer N, the task is to find the count of all the primes below N which can be expressed as the sum of two primes.
Examples:
Input: N = 6
Output: 1
5 is the only such prime below 6.
2 + 3 = 5.
Input: N = 11
Output: 2
Approach: Create an array prime[] where prime[i] will store whether i is prime or not using Sieve of Eratosthenes. Now for every prime from the range [1, N – 1], check whether it can be expressed as the sum of two primes using the approach discussed here.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
const int MAX = 100005;
bool prime[MAX];
void SieveOfEratosthenes()
{
memset (prime, true , sizeof (prime));
prime[0] = false ;
prime[1] = false ;
for ( int p = 2; p * p <= MAX; p++) {
if (prime[p]) {
for ( int i = p * 2; i <= MAX; i += p)
prime[i] = false ;
}
}
}
int countPrimes( int n)
{
SieveOfEratosthenes();
int cnt = 0;
for ( int i = 2; i < n; i++) {
if (prime[i] && prime[i - 2])
cnt++;
}
return cnt;
}
int main()
{
int n = 11;
cout << countPrimes(n);
return 0;
}
|
Java
class GFG
{
static int MAX = 100005 ;
static boolean []prime = new boolean [MAX];
static void SieveOfEratosthenes()
{
for ( int i = 0 ; i < MAX; i++)
prime[i] = true ;
prime[ 0 ] = false ;
prime[ 1 ] = false ;
for ( int p = 2 ; p * p < MAX; p++)
{
if (prime[p])
{
for ( int i = p * 2 ; i < MAX; i += p)
prime[i] = false ;
}
}
}
static int countPrimes( int n)
{
SieveOfEratosthenes();
int cnt = 0 ;
for ( int i = 2 ; i < n; i++)
{
if (prime[i] && prime[i - 2 ])
cnt++;
}
return cnt;
}
public static void main(String[] args)
{
int n = 11 ;
System.out.print(countPrimes(n));
}
}
|
Python3
MAX = 100005
prime = [ True for i in range ( MAX )]
def SieveOfEratosthenes():
prime[ 0 ] = False
prime[ 1 ] = False
for p in range ( MAX ):
if (p * p > MAX ):
break
if (prime[p]):
for i in range ( 2 * p, MAX , p):
prime[i] = False
def countPrimes(n):
SieveOfEratosthenes()
cnt = 0
for i in range ( 2 , n):
if (prime[i] and prime[i - 2 ]):
cnt + = 1
return cnt
n = 11
print (countPrimes(n))
|
C#
using System;
class GFG
{
static int MAX = 100005;
static bool []prime = new bool [MAX];
static void SieveOfEratosthenes()
{
for ( int i = 0; i < MAX; i++)
prime[i] = true ;
prime[0] = false ;
prime[1] = false ;
for ( int p = 2; p * p < MAX; p++)
{
if (prime[p])
{
for ( int i = p * 2; i < MAX; i += p)
prime[i] = false ;
}
}
}
static int countPrimes( int n)
{
SieveOfEratosthenes();
int cnt = 0;
for ( int i = 2; i < n; i++)
{
if (prime[i] && prime[i - 2])
cnt++;
}
return cnt;
}
public static void Main(String[] args)
{
int n = 11;
Console.Write(countPrimes(n));
}
}
|
Javascript
<script>
var MAX = 100005;
var prime = new Array(MAX).fill( false );
function SieveOfEratosthenes()
{
for (i = 0; i < MAX; i++)
prime[i] = true ;
prime[0] = false ;
prime[1] = false ;
for (p = 2; p * p < MAX; p++)
{
if (prime[p])
{
for (i = p * 2; i < MAX; i += p)
prime[i] = false ;
}
}
}
function countPrimes(n)
{
SieveOfEratosthenes();
var cnt = 0;
for (i = 2; i < n; i++)
{
if (prime[i] && prime[i - 2])
cnt++;
}
return cnt;
}
var n = 11;
document.write(countPrimes(n));
</script>
|
Time Complexity: O(N*log(√N)), where N represents the maximum integer
Auxiliary Space: O(N), where N represents the maximum integer
Approach 2: Constant Space:
- The Above Approach uses an array prime of size MAX to keep track of whether each number is prime or not. This array takes up MAX * sizeof(bool) bytes of memory.
- To implement the same logic in constant space, we can that checks whether a given number is prime or not. This function takes an integer n as input and returns true if n is prime, and false otherwise.
- The isPrime function uses trial division to check whether n is divisible by any integer between 2 and sqrt(n). Since we only need to check up to sqrt(n), the amount of memory used by the function is constant.
Here’s the updated code with the constant space:
C++
#include <cmath>
#include <iostream>
using namespace std;
bool isPrime( int n)
{
if (n <= 1) {
return false ;
}
for ( int i = 2; i <= sqrt (n); i++) {
if (n % i == 0) {
return false ;
}
}
return true ;
}
int countPrimes( int n)
{
int cnt = 0;
for ( int i = 2; i < n; i++) {
if (isPrime(i) && isPrime(i - 2)) {
cnt++;
}
}
return cnt;
}
int main()
{
int n = 11;
cout << countPrimes(n) << endl;
return 0;
}
|
Java
import java.util.*;
public class GFG {
static boolean isPrime( int n)
{
if (n <= 1 ) {
return false ;
}
for ( int i = 2 ; i <= Math.sqrt(n); i++) {
if (n % i == 0 ) {
return false ;
}
}
return true ;
}
static int countPrimes( int n)
{
int cnt = 0 ;
for ( int i = 2 ; i < n; i++) {
if (isPrime(i) && isPrime(i - 2 )) {
cnt++;
}
}
return cnt;
}
public static void main(String[] args)
{
int n = 11 ;
System.out.println(countPrimes(n));
}
}
|
Python
import math
def is_prime(n):
if n < = 1 :
return False
for i in range ( 2 , int (math.sqrt(n)) + 1 ):
if n % i = = 0 :
return False
return True
def count_primes(n):
count = 0
for i in range ( 2 , n):
if is_prime(i) and is_prime(i - 2 ):
count + = 1
return count
if __name__ = = "__main__" :
n = 11
print (count_primes(n))
|
C#
using System;
class GFG {
static bool IsPrime( int n)
{
if (n <= 1) {
return false ;
}
for ( int i = 2; i <= Math.Sqrt(n); i++) {
if (n % i == 0) {
return false ;
}
}
return true ;
}
static int CountPrimes( int n)
{
int cnt = 0;
for ( int i = 2; i < n; i++) {
if (IsPrime(i) && IsPrime(i - 2)) {
cnt++;
}
}
return cnt;
}
static void Main( string [] args)
{
int n = 11;
Console.WriteLine(
CountPrimes(n));
}
}
|
Javascript
function isPrime(n) {
if (n <= 1) {
return false ;
}
for (let i = 2; i <= Math.sqrt(n); i++) {
if (n % i === 0) {
return false ;
}
}
return true ;
}
function countPrimes(n) {
let cnt = 0;
for (let i = 2; i < n; i++) {
if (isPrime(i) && isPrime(i - 2)) {
cnt++;
}
}
return cnt;
}
const n = 11;
console.log(countPrimes(n));
|
Time Complexity: O(n * sqrt(n))
Auxiliary Space: O(1)
Last Updated :
14 Sep, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...