Cuenta números primos hasta N que se pueden representar como una suma de dos números primos

Dado un entero positivo N , la tarea es encontrar el número de números primos menores o iguales a N que se pueden representar como una suma de dos números primos .

Ejemplos:

Entrada: N = 6
Salida: 1
Explicación:
5 es el único número primo en el rango [1, 6] que se puede representar como la suma de 2 números primos, es decir, 5 = 2 + 3, donde 2, 3 y 5 son todos primos
Por lo tanto, la cuenta es 2.

Entrada: N = 14
Salida: 3

Enfoque ingenuo: el enfoque más simple para resolver el problema dado es considerar todos los pares posibles (i, j) en el rango [1, N] y si i y j son números primos y (i + j) se encuentra en el rango [1 , N] luego incrementa el conteo de números primos. Después de verificar todos los pares posibles, imprima el valor del conteo total obtenido. 

Complejidad de Tiempo: O(N 3 )
Espacio Auxiliar: O(1)

Enfoque eficiente: el enfoque anterior también se puede optimizar en función de la siguiente observación:

  • A excepción del 2 , todos los números primos son impares .
  • No es posible representar un número primo (que es impar ) como una suma de dos números primos impares, por lo que uno de los dos números primos debe ser 2 .
  • Entonces, para que un número primo X sea una suma de dos números primos, X – 2 también debe ser primo.

Siga los pasos a continuación para resolver el problema:

  • Inicialice una array, diga primo[] de tamaño 10 5 , y complete todos los números primos hasta 10 5 usando el Tamiz de Eratóstenes .
  • Inicialice una array auxiliar dp[] del tamaño (N + 1) donde dp[i] es el recuento de números primos menores o iguales que i que se pueden representar como una suma de 2 números primos .
  • Iterar sobre el rango [2, N] usando la variable i y realizar los siguientes pasos:
    • Actualice el valor de dp[i – 1] como la suma de dp[i – 1] y dp[i] .
    • Compruebe si prime[i] y prime[i – 2] son ​​verdaderos , luego incremente el valor de dp[i] en 1 .
  • Después de completar los pasos anteriores, imprima el valor de dp[N] como el conteo resultante.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to store all prime numbers
// up to N using Sieve of Eratosthenes
void SieveOfEratosthenes(
    int n, bool prime[])
{
    // Set 0 and 1 as non-prime
    prime[0] = 0;
    prime[1] = 0;
 
    for (int p = 2; p * p <= n; p++) {
 
        // If p is prime
        if (prime[p] == true) {
 
            // Set all multiples
            // of p as non-prime
            for (int i = p * p;
                 i <= n; i += p) {
                prime[i] = false;
            }
        }
    }
}
 
// Function to count prime numbers
// up to N that can be represented
// as the sum of two prime numbers
void countPrime(int n)
{
    // Stores all the prime numbers
    bool prime[n + 1];
    memset(prime, true, sizeof(prime));
 
    // Update the prime array
    SieveOfEratosthenes(n, prime);
 
    // Create a dp array of size n + 1
    int dp[n + 1];
 
    memset(dp, 0, sizeof(dp));
 
    // Update dp[1] = 0
    dp[1] = 0;
 
    // Iterate over the range [2, N]
    for (int i = 2; i <= n; i++) {
 
        // Add the previous count value
        dp[i] += dp[i - 1];
 
        // Increment dp[i] by 1 if i
        // and (i - 2) are both prime
        if (prime[i] == 1
            && prime[i - 2] == 1) {
            dp[i]++;
        }
    }
 
    // Print the result
    cout << dp[n];
}
 
// Driver Code
int main()
{
    int N = 6;
    countPrime(N);
 
    return 0;
}

Java

// Java approach for the above approach
class GFG{
     
// Function to store all prime numbers
// up to N using Sieve of Eratosthenes
static void SieveOfEratosthenes(int n, boolean prime[])
{
     
    // Set 0 and 1 as non-prime
    prime[0] = false;
    prime[1] = false;
 
    for(int p = 2; p * p <= n; p++)
    {
         
        // If p is prime
        if (prime[p] == true)
        {
             
            // Set all multiples
            // of p as non-prime
            for(int i = p * p; i <= n; i += p)
            {
                prime[i] = false;
            }
        }
    }
}
 
// Function to count prime numbers
// up to N that can be represented
// as the sum of two prime numbers
static void countPrime(int n)
{
     
    // Stores all the prime numbers
    boolean prime[] = new boolean[n + 1];
 
    for(int i = 0; i < prime.length; i++)
    {
        prime[i] = true;
    }
 
    // Update the prime array
    SieveOfEratosthenes(n, prime);
 
    // Create a dp array of size n + 1
    int dp[] = new int[n + 1];
    for(int i = 0; i < dp.length; i++)
    {
        dp[i] = 0;
    }
 
    // Update dp[1] = 0
    dp[1] = 0;
 
    // Iterate over the range [2, N]
    for(int i = 2; i <= n; i++)
    {
         
        // Add the previous count value
        dp[i] += dp[i - 1];
 
        // Increment dp[i] by 1 if i
        // and (i - 2) are both prime
        if (prime[i] == true &&
            prime[i - 2] == true)
        {
            dp[i]++;
        }
    }
 
    // Print the result
    System.out.print(dp[n]);
}
 
// Driver Code
public static void main(String[] args)
{
    int N = 6;
     
    countPrime(N);
}
}
 
// This code is contributed by abhinavjain194

Python3

# Python3 program for the above approach
 
# Function to store all prime numbers
# up to N using Sieve of Eratosthenes
def SieveOfEratosthenes(n, prime):
 
    # Set 0 and 1 as non-prime
    prime[0] = 0
    prime[1] = 0
 
    p = 2
     
    while p * p <= n:
 
        # If p is prime
        if (prime[p] == True):
 
            # Set all multiples
            # of p as non-prime
            for i in range(p * p, n + 1, p):
                prime[i] = False
 
        p += 1
 
# Function to count prime numbers
# up to N that can be represented
# as the sum of two prime numbers
def countPrime(n):
 
    # Stores all the prime numbers
    prime = [True] * (n + 1)
 
    # Update the prime array
    SieveOfEratosthenes(n, prime)
 
    # Create a dp array of size n + 1
    dp = [0] * (n + 1)
 
    # Update dp[1] = 0
    dp[1] = 0
 
    # Iterate over the range [2, N]
    for i in range(2, n + 1):
 
        # Add the previous count value
        dp[i] += dp[i - 1]
 
        # Increment dp[i] by 1 if i
        # and (i - 2) are both prime
        if (prime[i] == 1 and prime[i - 2] == 1):
            dp[i] += 1
 
    # Print the result
    print(dp[n])
 
# Driver Code
if __name__ == "__main__":
 
    N = 6
     
    countPrime(N)
     
# This code is contributed by mohit ukasp

C#

// C# program for the above approach
using System;
 
class GFG{
     
// Function to store all prime numbers
// up to N using Sieve of Eratosthenes
static void SieveOfEratosthenes(int n, bool[] prime)
{
     
    // Set 0 and 1 as non-prime
    prime[0] = false;
    prime[1] = false;
 
    for(int p = 2; p * p <= n; p++)
    {
         
        // If p is prime
        if (prime[p] == true)
        {
             
            // Set all multiples
            // of p as non-prime
            for(int i = p * p; i <= n; i += p)
            {
                prime[i] = false;
            }
        }
    }
}
 
// Function to count prime numbers
// up to N that can be represented
// as the sum of two prime numbers
static void countPrime(int n)
{
     
    // Stores all the prime numbers
    bool[] prime = new bool[n + 1];
 
    for(int i = 0; i < prime.Length; i++)
    {
        prime[i] = true;
    }
 
    // Update the prime array
    SieveOfEratosthenes(n, prime);
 
    // Create a dp array of size n + 1
    int[] dp = new int[n + 1];
    for(int i = 0; i < dp.Length; i++)
    {
        dp[i] = 0;
    }
 
    // Update dp[1] = 0
    dp[1] = 0;
 
    // Iterate over the range [2, N]
    for(int i = 2; i <= n; i++)
    {
         
        // Add the previous count value
        dp[i] += dp[i - 1];
 
        // Increment dp[i] by 1 if i
        // and (i - 2) are both prime
        if (prime[i] == true &&
            prime[i - 2] == true)
        {
            dp[i]++;
        }
    }
 
    // Print the result
    Console.Write(dp[n]);
}
 
// Driver code
static void Main()
{
    int N = 6;
     
    countPrime(N);
}
}
 
// This code is contributed by abhinavjain194

Javascript

<script>
 
// Javascript program for the above approach
 
// Function to store all prime numbers
// up to N using Sieve of Eratosthenes
function SieveOfEratosthenes(n, prime)
{
     
    // Set 0 and 1 as non-prime
    prime[0] = 0;
    prime[1] = 0;
 
    for(var p = 2; p * p <= n; p++)
    {
         
        // If p is prime
        if (prime[p] == Boolean(true))
        {
             
            // Set all multiples
            // of p as non-prime
            for(var i = p * p;i <= n; i += p)
            {
                prime[i] = Boolean(false);
            }
        }
    }
}
 
// Function to count prime numbers
// up to N that can be represented
// as the sum of two prime numbers
function countPrime(n)
{
     
    // Stores all the prime numbers
    var prime = new Array(n + 1);
    var x = new Boolean(true);
    prime.fill(x);
     
    // Update the prime array
    SieveOfEratosthenes(n, prime);
     
    // Create a dp array of size n + 1
    var dp = new Array(n + 1);
    dp.fill(0);
     
    // Update dp[1] = 0
    dp[1] = 0;
     
    // Iterate over the range [2, N]
    for(var i = 2; i <= n; i++)
    {
         
        // Add the previous count value
        dp[i] += dp[i - 1];
         
        // Increment dp[i] by 1 if i
        // and (i - 2) are both prime
        if (prime[i] == Boolean(true) &&
            prime[i - 2] == Boolean(true))
        {
            dp[i]++;
         
        }
    }
     
    // Print the result
    document.write(dp[n]);
}
 
// Driver code
var n = 6;
 
countPrime(n);
 
// This code is contributed by SoumikMondal
 
</script>
Producción: 

1

 

Complejidad de tiempo: O(N * log(log(N)))
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por nihalkumar703 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *