Contact și feedback

Nu obții 100 de puncte sau ai nelămuriri în privința problemelor? Scrie-mi pe Instagram.


Ai găsit o greșeală, vrei să raportezi un utilizator sau vrei să comunici altceva? Folosește formularul de contact.


Vrei să ne transmiți o părere despre platformă? Folosește formularul de feedback.

Shortcuturi

Folosește următoarele shortcuturi pentru a naviga mai ușor pe platformă.

Generale

Meniu shortcuturi?
Căutare probleme sau utilizatori/
Navigare printre rezultatele căutării↑, ↓
Meniu de contact și feedbackCTRL + Shift + F
Ieșire din meniuriEsc

Editor probleme

Setări editorCTRL + Shift + S
Schimbare stil editorCTRL + Shift + E
Șabloane de codCTRL + Shift + 1/2/3
Golire editorCTRL + Shift + 4

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

Cuprinsul lecției

Se încarcă…

Citește și

Distanța dintre două puncte în C++Inversarea unui șir de caractere în C++Sortare crescătoare recursivă în C++ - Merge sort și Bubble sortCitește un șir de caractere cu spații în C++Cea mai lungă secvență de elemente crescătoare în C++Maximul și minimul a trei valori în C++Numărul de apariții al unui număr într-un vector în C++Factorialul unui număr în C++Aria unui triunghi folosind coordonatele acestora în C++Afișarea elementelor unui vector recursiv în C++Cel mai mic/mare divizor prim al numerelor de la 1 la N (Folosind ciurul lui Eratostene)Al N-lea termen Fibonacci în C++Numărul de cifre ale factorialului unui numărIndicatorul lui Euler în C++Ce este o funcție void în C++?Do while vs while în C++ - Care e diferența?Verifică dacă un caracter este cifră în C++Câte numere naturale sunt într-un interval dat? (C++)Suma 1 + 2 + 3 + ... + N în C++Cum să citești și să afișezi în fișiere în C++Operații cu numere mari în C++ - Toate funcțiile explicateCifra de control a unui numărCe este o variabilă unsigned în C++?Ridicarea la putere în timp logaritmic în C++. Exponențiere rapidăCifra maximă și minimă a unui număr în C++Bordarea unei matrice în C++Transformarea unei litere mari în literă mică în C++Suma numerelor naturale dintr-un interval dat în C++Copiuțe: Cifrele unui numărȘiruri de caractere în C++. Tot ce trebuie să știiInstrucțiunea continue (structuri repetitive)Maximul și minimul unui vector în C++Recursivitate în C++Cel mai mare divizor comun (CMMDC) a două numere în C++Calculul combinărilor de n luate câte k (nCk) în C++Suma elementelor unui vector recursiv în C++Verifică dacă un număr aparține șirului Fibonacci în C++Numărul aranjamentelor în C++ (formula aranjamentelor)Suma divizorilor unui număr în C++Tipuri de date în C++: numere întregi, reale, caractere și alteleStructuri repetitive (while, do while, for, etc)Oglinditul unui număr în C++Verifică dacă o literă este vocală în C++Instrucțiunea for (structuri repetitive)Prima cifră a unui număr în C++Transformarea unui număr din baza 10 în baza 2 în C++Matrice pătratice în C++. Diagonala principală și secundarăCel mai mic număr cu suma cifrelor N în C++Cel mai semnificativ bit în C++Interclasarea a doi vectori în C++Tipul struct în C++. Ce sunt structurile de date neomogenePointer în C++. Variabile de tipul char * (char steluță)Aplicații cu ciurul lui Eratostene în C++: suma divizorilor, numărul divizorilorVectorii în C++: citire și afișareAflarea sumei primelor N sume GaussTransformarea unei litere mici în literă mare în C++Valoarea absolută (modulul) unui număr în C++Verificarea unui an bisect în C++Verificare dacă un număr este palindrom în C++Șirul lui Fibonacci în C++Numere triunghiulare. Verificarea unui număr triunghiularVerificare număr prim în C++ (Clasa a IX-a)Radicalul unui număr în C++ (rădăcina pătrată)Cel mai frecvent element dintr-un șir în C++Vectori de frecvență (de apariții) în C++Rădăcina cubică a unui număr în C++ (cube root)Ciurul lui Eratostene în C++Funcții în C++. Ce sunt subprogrameleAflă secolul unui an citit de la tastatură în C++Suma divizorilor numerelor de la 1 la N (Folosind ciurul lui Eratostene)Citirea și afișarea matricelor în C++Cum să calculezi instant 2 la puterea N în C++Al N-lea termen dintr-o progresie geometricăComplexitatea unui algoritm (timp și spațiu) în C++Numărul de divizori al unui număr în C++Inversarea unui vector în C++Instrucțiunea do while (structuri repetitive)CMMMC a două numere în C++ (cel mai mic multiplu comun)Vectorii în C++: declarare și parcurgereCifrele unui număr. Prelucrarea cifrelor unui număr în C++Cifra maximă a unui număr recursiv în C++Maximul și minimul a n valori în C++Indicatorul lui Euler al numerelor de la 1 la N (Folosind ciurul lui Eratostene)Comentarii în C++Numărul de divizori al numerelor de la 1 la N (Folosind ciurul lui Eratostene)Căutare binară în C++Aria și circumferința unui cerc în C++Matrice Fibonacci - al n-lea termen Fibonacci în timp logaritmicOglinditul recursiv al unui număr în C++CMMDC recursiv a două numere naturale în C++Ce înseamnă variabilă globală și locală în C++?Interschimbarea a două variabile în C++ (3 metode)Verifică dacă un număr dat este o putere de 2 în C++Numărul de divizori primi ai unui număr în C++Verifică dacă trei puncte sunt coliniare C++Algoritm recursiv pentru căutare binară (clasa a X-a)Materia pentru olimpiada de informatică - tot ce trebuie să știiNumărul combinărilor în C++ (formula combinărilor)Codul ASCII (tabel complet)Matrice în C++. Declararea și parcurgerea tablourilor bidimensionaleMaximul și minimul a două valori în C++Verificare dacă șir de caractere este palindrom în C++Mediana unui șir de valori în C++Instrucțiunea break (structuri repetitive)Numărul permutărilor în C++ (formula permutărilor)Cum să afișezi partea întreagă a unui număr real în C++Transformarea unui număr din baza 2 în baza 10 în C++Verifică dacă un bit de pe o anumită poziție este 1 sau 0 în C++Instrucțiunea while (structuri repetitive)Verifică dacă un caracter este literă în C++Funcții predefinite în C++ (matematice, șiruri de caractere)Numărul minim de peroane pentru o gară în C++Verifică dacă un număr este par sau impar fără modulo în C++Ce înseamnă endl în C++?Combinatorică în C++: permutări, aranjamente, combinări și alteleCel mai puțin semnificativ bit în C++Generarea șirului Fibonacci generalizat în C++Al N-lea termen dintr-o progresie aritmeticăInstrucțiunea de decizie în C++: if, else, switch, caseAfișarea divizorilor primi ai unui număr în C++Verifică dacă o literă este mică sau mare în C++De ce cer unele probleme răspunsul modulo 666013 sau modulo 1.000.000.007?Tutorial instalare CodeBlocks (ușor) - Introducere în informatică C++Divide et Impera (metodă de programare C++)

© Drepturi de autor

Echipa InfoAs își rezervă drepturile de autor pentru conținutul acestei pagini. Copierea conținutului fără acordul scris expres al InfoAs reprezintă o încălcare a Legii 8/1996 și va fi tratată ca atare.

Trimite lecția

Toată lecția

Doar videoclipul pe YouTube

Informatica devine ușoară cu InfoAs

Intră în cont