es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El conteo de divisores, la suma y el consumo de tiempo son un problema en tecnología de la información.

Quiero escribir los divisores de todos los números entre 1,…,n para un n dado y luego mostrar el número de ellos y su suma.
Por ejemplo:
Para 3:
1,1,2,1,3
La salida es 5, 8
Intenté obtener cada j en el rango 1,n y luego contar el número de divisores utilizando el siguiente código
pero no es eficiente debido al tiempo que consume.

int count=0;
int sum=0;
for(int j=1,j<=n,j++){
for(int i=1,i<=j,i++){
if(j%i==0){
count+=1;
sum+=i;
}
}
}

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una manera más eficiente de hacer esto es usando el algoritmo Criba de Eratóstenes. Este algoritmo se utiliza para encontrar todos los números primos hasta un número dado. La idea es crear una lista de enteros consecutivos desde 2 hasta n e inicialmente marcarlos todos como primos. Luego, comenzando desde 2, marcar todos los múltiplos de 2 como no primos. Luego, moverse al siguiente número no marcado (3) y marcar todos los múltiplos de 3 como no primos. Este proceso se repite hasta que todos los números hasta n estén marcados. Los números que permanecen sin marcar son números primos.

    Usando este algoritmo, puedes encontrar el número de divisores y la suma de divisores para un número dado n. El código para este algoritmo es el siguiente:

    // Crear un array booleano "prime[0..n]" y inicializar 
    // todas las entradas como verdadero. Un valor en prime[i] 
    // finalmente será falso si i no es primo, de lo contrario verdadero. 
    boolean prime[n+1]; 
    for(int i=0;i<=n;i++) 
        prime[i] = true; 
    
    for(int p = 2; p*p <=n; p++) 
    { 
        // Si prime[p] no cambia, entonces es primo 
        if(prime[p] == true) 
        { 
            // Actualizar todos los múltiplos de p 
            for(int i = p*2; i <= n; i += p) 
                prime[i] = false; 
        } 
    } 
    
    // Imprimir todos los números primos 
    for(int i = 2; i <= n; i++) 
    { 
        if(prime[i]) 
        { 
            // Contar el número de divisores 
            int count = 0; 
            for (int j=1; j<=i; j++) 
                if (i%j==0) 
                    count++; 
    
            // Suma de divisores 
            int sum = 0; 
            for (int j=1; j<=i; j++) 
                if (i%j==0) 
                    sum += j; 
    
            // Imprimir el número de divisores y la suma de divisores 
            System.out.println("Número de divisores: " + count + " Suma de divisores: " + sum); 
        } 
    } 
    

Comments are closed.