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.
Folosește următoarele shortcuturi pentru a naviga mai ușor pe platformă.
Meniu shortcuturi | ? |
Căutare probleme sau utilizatori | / |
Navigare printre rezultatele căutării | ↑, ↓ |
Meniu de contact și feedback | CTRL + Shift + F |
Ieșire din meniuri | Esc |
Setări editor | CTRL + Shift + S |
Schimbare stil editor | CTRL + Shift + E |
Șabloane de cod | CTRL + Shift + 1/2/3 |
Golire editor | CTRL + Shift + 4 |
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.
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.
#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;
}
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
.
#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;
}