Números en el rango [L, R] tales que el conteo de sus divisores es par y primo

Dado un rango [L, R], la tarea es encontrar los números del rango que tienen la cuenta de sus divisores tanto como primos. 
Luego, imprima el conteo de los números encontrados. Los valores de L y R son inferiores a 10^6 y L< R.
Ejemplos: 
 

Input: L=3, R=9
Output: Count = 3
Explanation: The numbers are 3, 5, 7 

Input : L=3, R=17
Output : Count: 6
  1. El único número que es primo, además de par, es ‘2’.
  2. Entonces, necesitamos encontrar todos los números dentro del rango dado que tienen exactamente 2 divisores, 
    es decir, números primos.

Un enfoque simple: 
 

  1. Comience un ciclo de ‘l’ a ‘r’ y verifique si el número es primo (tomará más tiempo para un rango más grande).
  2. Si el número es primo, incremente la variable de conteo.
  3. Al final, imprima el valor de la cuenta.

Un enfoque eficiente: 
 

  • Tenemos que contar los números primos en el rango [L, R].
  • Primero, cree un tamiz que ayude a determinar si el número es primo o no en el tiempo O(1).
  • Luego, cree una array de prefijos para almacenar el conteo de números primos donde el elemento en el índice ‘i’ contiene el conteo de números primos de ‘1’ a ‘i’.
  • Ahora, si queremos encontrar el conteo de números primos en el rango [L, R], el conteo será (sum[R] – sum[L-1])
  • Finalmente, imprima el resultado, es decir (sum[R] – sum[L-1])

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

C++

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
#define MAX 1000000
 
// stores whether the number is prime or not
bool prime[MAX + 1];
 
// stores the count of prime numbers
// less than or equal to the index
int sum[MAX + 1];
 
// create the sieve
void SieveOfEratosthenes()
{
    // Create a boolean array "prime[0..n]" and initialize
    // all the entries as true. A value in prime[i] will
    // finally be false if 'i' is Not a prime, else true.
    memset(prime, true, sizeof(prime));
    memset(sum, 0, sizeof(sum));
    prime[1] = false;
 
    for (int p = 2; p * p <= MAX; 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 <= MAX; i += p)
                prime[i] = false;
        }
    }
 
    // stores the prefix sum of number
    // of primes less than or equal to 'i'
    for (int i = 1; i <= MAX; i++) {
        if (prime[i] == true)
            sum[i] = 1;
 
        sum[i] += sum[i - 1];
    }
}
 
// Driver code
int main()
{
    // create the sieve
    SieveOfEratosthenes();
 
    // 'l' and 'r' are the lower and upper bounds
    // of the range
    int l = 3, r = 9;
 
    // get the value of count
    int c = (sum[r] - sum[l - 1]);
 
    // display the count
    cout << "Count: " << c << endl;
 
    return 0;
}

Java

// Java implementation of the approach
class GFG
{
    static final int MAX=1000000;
     
    // stores whether the number is prime or not
    static boolean []prime=new boolean[MAX + 1];
     
    // stores the count of prime numbers
    // less than or equal to the index
    static int []sum=new int[MAX + 1];
     
    // create the sieve
    static void SieveOfEratosthenes()
    {
        // Create a boolean array "prime[0..n]" and initialize
        // all the entries as true. A value in prime[i] will
        // finally be false if 'i' is Not a prime, else true.
        for(int i=0;i<=MAX;i++)
            prime[i]=true;
             
         for(int i=0;i<=MAX;i++)
            sum[i]=0;
         
        prime[1] = false;
     
        for (int p = 2; p * p <= MAX; 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 <= MAX; i += p)
                    prime[i] = false;
            }
        }
     
        // stores the prefix sum of number
        // of primes less than or equal to 'i'
        for (int i = 1; i <= MAX; i++) {
            if (prime[i] == true)
                sum[i] = 1;
     
            sum[i] += sum[i - 1];
        }
    }
     
    // Driver code
    public static void main(String []args)
    {
        // create the sieve
        SieveOfEratosthenes();
     
        // 'l' and 'r' are the lower and upper bounds
        // of the range
        int l = 3, r = 9;
     
        // get the value of count
        int c = (sum[r] - sum[l - 1]);
     
        // display the count
        System.out.println("Count: " + c);
     
    }
 
}

Python 3

# Python 3 implementation of the approach
MAX = 1000000
 
# stores whether the number is prime or not
prime = [True] * (MAX + 1)
 
# stores the count of prime numbers
# less than or equal to the index
sum = [0] * (MAX + 1)
 
# create the sieve
def SieveOfEratosthenes():
 
    prime[1] = False
 
    p = 2
    while p * p <= MAX:
 
        # If prime[p] is not changed,
        # then it is a prime
        if (prime[p]):
 
            # Update all multiples of p
            i = p * 2
            while i <= MAX:
                prime[i] = False
                i += p
                 
        p += 1
 
    # stores the prefix sum of number
    # of primes less than or equal to 'i'
    for i in range(1, MAX + 1):
        if (prime[i] == True):
            sum[i] = 1
 
        sum[i] += sum[i - 1]
 
# Driver code
if __name__ == "__main__":
     
    # create the sieve
    SieveOfEratosthenes()
 
    # 'l' and 'r' are the lower and
    # upper bounds of the range
    l = 3
    r = 9
 
    # get the value of count
    c = (sum[r] - sum[l - 1])
 
    # display the count
    print("Count:", c)
 
# This code is contributed by ita_c

C#

// C# implementation of the approach
 
 
using System;
class GFG
{
    static int MAX=1000000;
     
    // stores whether the number is prime or not
    static bool []prime=new bool[MAX + 1];
     
    // stores the count of prime numbers
    // less than or equal to the index
    static int []sum=new int[MAX + 1];
     
    // create the sieve
    static void SieveOfEratosthenes()
    {
        // Create a boolean array "prime[0..n]" and initialize
        // all the entries as true. A value in prime[i] will
        // finally be false if 'i' is Not a prime, else true.
        for(int i=0;i<=MAX;i++)
            prime[i]=true;
             
         for(int i=0;i<=MAX;i++)
            sum[i]=0;
         
        prime[1] = false;
     
        for (int p = 2; p * p <= MAX; 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 <= MAX; i += p)
                    prime[i] = false;
            }
        }
     
        // stores the prefix sum of number
        // of primes less than or equal to 'i'
        for (int i = 1; i <= MAX; i++) {
            if (prime[i] == true)
                sum[i] = 1;
     
            sum[i] += sum[i - 1];
        }
    }
     
    // Driver code
    public static void Main()
    {
        // create the sieve
        SieveOfEratosthenes();
     
        // 'l' and 'r' are the lower and upper bounds
        // of the range
        int l = 3, r = 9;
     
        // get the value of count
        int c = (sum[r] - sum[l - 1]);
     
        // display the count
        Console.WriteLine("Count: " + c);
     
    }
 
}

PHP

<?php
// PHP implementation of the approach
$MAX = 100000;
 
// Create a boolean array "prime[0..n]"
// and initialize all the entries as
// true. A value in prime[i] will finally
// be false if 'i' is Not a prime, else true.
 
// stores whether the number
// is prime or not
$prime = array_fill(0, $MAX + 1, true);
 
// stores the count of prime numbers
// less than or equal to the index
$sum = array_fill(0, $MAX + 1, 0);
 
// create the sieve
function SieveOfEratosthenes()
{
    global $MAX, $sum, $prime;
    $prime[1] = false;
 
    for ($p = 2; $p * $p <= $MAX; $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 <= $MAX; $i += $p)
                $prime[$i] = false;
        }
    }
 
    // stores the prefix sum of number
    // of primes less than or equal to 'i'
    for ($i = 1; $i <= $MAX; $i++)
    {
        if ($prime[$i] == true)
            $sum[$i] = 1;
 
        $sum[$i] += $sum[$i - 1];
    }
}
 
// Driver code
 
// create the sieve
SieveOfEratosthenes();
 
// 'l' and 'r' are the lower
// and upper bounds of the range
$l = 3;
$r = 9;
 
// get the value of count
$c = ($sum[$r] - $sum[$l - 1]);
 
// display the count
echo "Count: " . $c . "\n";
 
// This code is contributed by mits
?>

Javascript

<script>
 
// Javascript implementation of the approach
var MAX = 1000000;
 
// stores whether the number is prime or not
var prime = Array(MAX+1).fill(true);
 
// stores the count of prime numbers
// less than or equal to the index
var sum = Array(MAX+1).fill(0);
 
// create the sieve
function SieveOfEratosthenes()
{
    // Create a boolean array "prime[0..n]" and initialize
    // all the entries as true. A value in prime[i] will
    // finally be false if 'i' is Not a prime, else true.
 
    prime[1] = false;
 
    for (var p = 2; p * p <= MAX; p++) {
 
        // If prime[p] is not changed, then it is a prime
        if (prime[p]) {
 
            // Update all multiples of p
            for (var i = p * 2; i <= MAX; i += p)
                prime[i] = false;
        }
    }
 
    // stores the prefix sum of number
    // of primes less than or equal to 'i'
    for (var i = 1; i <= MAX; i++) {
        if (prime[i] == true)
            sum[i] = 1;
 
        sum[i] += sum[i - 1];
    }
}
 
// Driver code
// create the sieve
SieveOfEratosthenes();
// 'l' and 'r' are the lower and upper bounds
// of the range
var l = 3, r = 9;
// get the value of count
var c = (sum[r] - sum[l - 1]);
// display the count
document.write( "Count: " + c );
 
</script>
Producción: 

Count: 3

 

Publicación traducida automáticamente

Artículo escrito por andrew1234 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 *