Se citeşte un număr natural n. Să se verifice dacă n
este sau nu un număr perfect.
Dacă n = 6, atunci algoritmul va afişa DA. Numărul n = 6
este perfect, deoarece 2 × 6 = 1 + 2 + 3 + 6
Dacă n = 8, atunci algoritmul va afişa NU. Numărul n =
8 nu este perfect, deoarece 2 × 8 != 1 + 2 + 4 + 8
.
Putem folosi proprietatea “Un număr perfect este un număr întreg pozitiv care este egal cu suma divizorilor săi pozitivi diferiți de el însuși.“
Pasul 1: Citim numărul n.
Pasul 2: Inițializăm variabila s cu 0. (în s vom calcula suma divizorilor lui n diferiți de n)
Pasul 3: Calculăm în s suma tuturor divizorilor lui n diferiți de n
Pasul 4: Dacă n = s atunci n este număr perfect și afișăm "DA"
altfel n nu este număr perfect și afișăm "NU"
n,d,s întreg
citeşte n
s ← 0
pentru d ← 1, n-1 execută
| dacă n % d = 0 atunci
| | s ← s + d
| |▄
|▄
dacă n = s atunci
| scrie “DA”
|altfel
| scrie “NU”
|▄
/***********************************************************
numar perfect - V1
************************************************************/
#include <iostream>
using namespace std;
int main() {
int n, d, s;
cout << "Introduceti un numar: ";
cin >> n;
s = 0;
for (d = 1; d <= n-1; d++) {
if (n % d == 0) {
s += d; // adaugam divizorul la suma
}
}
// Verificam daca suma divizorilor este egala cu numarul
if (n == s) {
cout << "DA" << endl; // n este un numar perfect
} else {
cout << "NU" << endl; // n nu este un numar perfect
}
return 0;
}
Putem folosi proprietatea “Un număr natural n este perfect dacă dublul său este egal cu suma divizorilor săi.“
Pasul 1: Citim numărul n.
Pasul 2: Inițializăm variabila s cu 0. (în s vom calcula suma divizorilor)
Pasul 3: Calculăm în s suma tuturor divizorilor lui n
Pasul 4: Dacă 2*n = s atunci n este număr perfect și afișăm "DA"
altfel n nu este număr perfect și afișăm "NU"
n,d,s întreg
citeşte n
s ← 0
pentru d ← 1, sqrt(n) execută
| dacă n % d = 0 atunci
| | s ← s + d
| | dacă d != n/d atunci
| | s ← s+ n/d
| |▄
|▄
dacă 2*n = s atunci
| scrie “DA”
|altfel
| scrie “NU”
|▄
/***********************************************************
numar perfect - V2 algoritm eficient
************************************************************/
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n, d, s;
cout << "Introduceti un numar: ";
cin >> n;
s = 0;
for (d = 1; d <= sqrt(n); d++) {
if (n % d == 0) {
s += d; // adaugam divizorul la suma
if (d != n / d) {
s += n / d; // adaugam si celalalt divizor (n/d) daca este diferit
}
}
}
// Verificam daca suma divizorilor este dublul numarului
if (2 * n == s) {
cout << "DA" << endl; // n este un numar perfect
} else {
cout << "NU" << endl; // n nu este un numar perfect
}
return 0;
}
Observație
Acest algoritm folosește metoda eficientă de determinare a divizorilor unui număr.