Suma divizorilor numerelor de la 1 la N (Folosind ciurul lui Eratostene)

Dându-se un număr natural n, să se afișeze pe ecran suma divizorilor tuturor numerelor de la 1 la n.

Exemplu. Pentru n = 10, răspunsul este 1 3 4 7 6 12 8 15 13 18 (1 are suma divizorilor 1, 2 are suma divizorilor 1 + 2 = 3, etc.).

Vom prezenta două metode, prima naivă și a doua folosind un algoritm similar cu cel de la Ciurul lui Eratostene.

Metoda 1 (naivă)

O primă metodă constă în parcurgerea tuturor numerelor de la 1 la n și aflarea, folosind algoritmul de determinare a sumei divizorilor, suma divizorilor numărului curent.

Algoritmul este destul de intuitiv, însă nu este îndeajuns de eficient.

Implementare C++

#include <iostream>

using namespace std;

int main()
{
    //Declarăm și citim n
    int n;
    cin >> n;

    //Parcurgem toate numerele de la 1 la n și determinăm divizorii fiecăruia
    //Mai multe detalii găsiți mai sus
    for(int i = 1; i <= n; i++) {
        int sumDiv = 0; //Suma divizorilor al numărului curent
        for(int d = 1; d * d <= i; d++) {
            if(i % d == 0) { //Am găsit un divizor
                sumDiv += d;
                if(d != i / d) { //Perechea divizorului diferă de numărul în sine
                    sumDiv += i / d;
                }
            }
        }
        cout << sumDiv << " ";
    }
    return 0;
}

Metoda 2 (ciurul lui Eratostene)

Ciurul lui Eratostene este un algoritm important care ia numeroase forme, însă la bază poate să determine pentru orice număr de la 1 la n, care sunt prime. Această lecție explică în detaliu cum funcționează algoritmul ciurului lui Eratostene.

Putem să adaptăm un pic algoritmul: pentru numărul curent i, vom lua toți multiplii săi j, iar suma divizorilor numărului j crește cu i.

Implementare C++

#include <iostream>

using namespace std;

//Ne declarăm ciurul
int ciur[1001];

int main()
{
    //Declarăm și citim n
    int n;
    cin >> n;

    for(int i = 1; i <= n; i++) //Pentru toate numerele de la 1 la n
        for(int j = i; j <= n; j += i) //Luăm toți multipli numărului, mai mici sau egali cu n
            ciur[j] += i;

    //Afișăm la final suma divizorilor numerelor de la 1 la n
    for(int i = 1; i <= n; i++) {
        cout << ciur[i] << " ";
    }
    return 0;
}

Alte resurse sau bibliografie

DS

Autorul acestei lecții

Dominic Satnoianu

Această lecție a fost redactată de către Dominic Satnoianu.

© 2021 – 2025 Aspire Education Labs SRL. Toate drepturile rezervate.

Așa cum este specificat și în termeni și condiții, conținutul acestei pagini este protejat de legea drepturilor de autor și este interzisă copierea sau modificarea acestuia fără acordul scris al autorilor.

Încălcarea drepturilor de autor este o infracțiune și se pedepsește conform legii.

Comentarii 0

Autentifică-te pentru a putea comenta.

Autentifică-te