Cuente números enteros de un rango dado sin divisores impares

Dada una array arr[] que consta de N enteros, la tarea es contar el número de enteros en el rango [1, arr[i]] que no contiene ningún divisor impar .

Ejemplos:

Entrada: arr[] = {15, 16, 20, 35}
Salida: 3 4 4 5
Explicación: 
Los números sin divisores impares de 1 a arr[0] ( = 15) , son 2, 4, 8. Por lo tanto, el cuenta es 3.
De manera similar, para arr[1] (= 16), arr[2] (= 20), arr[3] (= 35) la cuenta es 4, 4 y 5 respectivamente.

Entrada: arr[] = {24}
Salida: 4

Enfoque ingenuo: el enfoque más simple es recorrer la array y, para cada elemento de la array arr[i] , verificar si un número tiene divisores impares en el rango [1, arr[i]] o no. Si no tiene divisores impares, incrementa la cuenta. De lo contrario, continúe con el siguiente número entero. Finalmente, imprima el conteo obtenido para cada elemento del arreglo arr[i]
Complejidad de tiempo: O(N*max(arr[i]))
Espacio auxiliar: O(1)

Enfoque eficiente: la idea óptima se basa en la siguiente observación:

Observación:

Cualquier número se puede representar de la forma p 1 x 1 * p 2 x 2 *- – -*p N x N , donde p i es un número primo y x i es su potencia. Si el número no tiene ningún divisor impar, entonces no debe contener ningún factor primo impar .

Por lo tanto, el problema se reduce a encontrar el conteo de números enteros en el rango de 1 a N tal que esos números sean una potencia de dos , lo que se puede hacer en complejidad de tiempo log(N) comprobando repetidamente la potencia de dos tal que 2 i ≤ N y conteo creciente en cada paso.

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

  • Recorra la array arr[] y realice las siguientes operaciones:
    • Inicialice dos variables, digamos powerOfTwo , para verificar la potencia máxima de 2 que es menor que arr[i] y otra variable, digamos count , para almacenar el conteo de enteros en el rango [1, arr[i]] sin divisores impares .
    • Encuentre para cada elemento de la array, el valor de powerOfTwo y count .
    • Imprímalos como la respuesta para cada elemento de la array.

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 count integers in the
// range 1 to N having no odd divisors
void oddDivisors(int arr[], int N)
{
    // Traverse the array
    for (int i = 0; i < N; i++) {
 
        // Stores the nearest power
        // of two less than arr[i]
        int powerOfTwo = 2;
 
        // Stores the count of integers
        // with no odd divisor for each query
        int count = 0;
 
        // Iterate until powerOfTwo is
        // less then or equal to arr[i]
        while (powerOfTwo <= arr[i]) {
 
            count++;
            powerOfTwo = 2 * powerOfTwo;
        }
 
        // Print the answer for
        // the current element
        cout << count << " ";
    }
 
    return;
}
 
// Driver Code
int main()
{
    // Given array
    int arr[] = { 15, 16, 20, 35 };
 
    // Size of the array
    int N = sizeof(arr) / sizeof(arr[0]);
 
    oddDivisors(arr, N);
 
    return 0;
}

Java

// Java program to implement
// the above approach
import java.util.*;
 
class GFG{
 
// Function to count integers in the
// range 1 to N having no odd divisors
static void oddDivisors(int arr[], int N)
{
   
    // Traverse the array
    for (int i = 0; i < N; i++)
    {
 
        // Stores the nearest power
        // of two less than arr[i]
        int powerOfTwo = 2;
 
        // Stores the count of integers
        // with no odd divisor for each query
        int count = 0;
 
        // Iterate until powerOfTwo is
        // less then or equal to arr[i]
        while (powerOfTwo <= arr[i])
        {
            count++;
            powerOfTwo = 2 * powerOfTwo;
        }
 
        // Print the answer for
        // the current element
        System.out.print(count + " ");
    }
    return;
}
 
// Driver Code
public static void main(String args[])
{
    // Given array
    int arr[] = { 15, 16, 20, 35 };
 
    // Size of the array
    int N = arr.length;
    oddDivisors(arr, N);
}
}
 
// This code is contributed by sanjoy_62.

Python3

# Python3 program for the above approach
 
# Function to count integers in the
# range 1 to N having no odd divisors
def oddDivisors(arr, N) :
 
    # Traverse the array
    for i in range(N) :
 
        # Stores the nearest power
        # of two less than arr[i]
        powerOfTwo = 2;
 
        # Stores the count of integers
        # with no odd divisor for each query
        count = 0;
 
        # Iterate until powerOfTwo is
        # less then or equal to arr[i]
        while (powerOfTwo <= arr[i]) :
 
            count += 1;
            powerOfTwo = 2 * powerOfTwo;
 
        # Print the answer for
        # the current element
        print(count, end = " ");
 
# Driver Code
if __name__ == "__main__" :
 
    # Given array
    arr = [ 15, 16, 20, 35 ];
 
    # Size of the array
    N = len(arr);
 
    oddDivisors(arr, N);
 
    # This code is contributed by AnkThon

C#

// C# program to implement
// the above approach
using System;
class GFG
{
 
// Function to count integers in the
// range 1 to N having no odd divisors
static void oddDivisors(int[] arr, int N)
{
   
    // Traverse the array
    for (int i = 0; i < N; i++)
    {
 
        // Stores the nearest power
        // of two less than arr[i]
        int powerOfTwo = 2;
 
        // Stores the count of integers
        // with no odd divisor for each query
        int count = 0;
 
        // Iterate until powerOfTwo is
        // less then or equal to arr[i]
        while (powerOfTwo <= arr[i])
        {
            count++;
            powerOfTwo = 2 * powerOfTwo;
        }
 
        // Print the answer for
        // the current element
        Console.Write(count + " ");
    }
    return;
}
 
// Driver Code
public static void Main(String[] args)
{
   
    // Given array
    int[] arr = { 15, 16, 20, 35 };
 
    // Size of the array
    int N = arr.Length;
    oddDivisors(arr, N);
}
}
 
// This code is contributed by sanjoy_62.

Javascript

<script>
 
// JavaScript program to implement
// the above approach
 
    // Function to count integers in the
    // range 1 to N having no odd divisors
    function oddDivisors(arr , N) {
 
        // Traverse the array
        for (i = 0; i < N; i++) {
 
            // Stores the nearest power
            // of two less than arr[i]
            var powerOfTwo = 2;
 
            // Stores the count of integers
            // with no odd divisor for each query
            var count = 0;
 
            // Iterate until powerOfTwo is
            // less then or equal to arr[i]
            while (powerOfTwo <= arr[i]) {
                count++;
                powerOfTwo = 2 * powerOfTwo;
            }
 
            // Print the answer for
            // the current element
            document.write(count + " ");
        }
        return;
    }
 
    // Driver Code
     
        // Given array
        var arr = [ 15, 16, 20, 35 ];
 
        // Size of the array
        var N = arr.length;
        oddDivisors(arr, N);
 
// This code contributed by aashish1995
 
</script>
Producción: 

3 4 4 5

 

Complejidad de tiempo: O(N * log(max(arr[i]))
Espacio auxiliar: O(1) 

Publicación traducida automáticamente

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