Liczby doskonałe to takie liczby, których suma dzielników od niej mniejszych jest równa tej liczbie.
Trzy pierwsze liczby doskonałe:
Aby wygenerować liczby doskonałe, skorzystamy ze wzoru:
gdzie i są liczbami pierwszymi.
Przykłady:
Jak można zauważyć, dla nie ma liczby doskonałej (2047 nie jest liczbą pierwszą).
Najlepszym sposobem na generowanie liczb pierwszych byłoby użycie Sita Erastotenesa. Warto mieć jednak na uwadze, że kolejne liczby doskonałe bardzo szybko rosną (piąta liczba doskonała wynosi już 33550336!). Nie będę się zajmował generowaniem liczb doskonałych w algorytmie, raczej nie wystąpi to na maturze.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;
bool czyDoskonala(int liczba) {
int sumaDzielnikow = 0;
// Wyznaczamy wszystkie dzielniki liczby i je sumujemy
for(int i = 1; i < liczba; i++) {
if(liczba % i == 0) {
sumaDzielnikow += i;
}
}
// Jeżeli suma dzielników jest równa liczbie, liczba jest doskonała
return liczba == sumaDzielnikow;
}
int main() {
cout << "Sprawdzamy klika liczb, czy są doskonałe" << endl << endl;
cout << "6 - " << (czyDoskonala(6) ? "doskonała" : "niedoskonała") << endl;
cout << "7 - " << (czyDoskonala(7) ? "doskonała" : "niedoskonała") << endl;
cout << "20 - " << (czyDoskonala(20) ? "doskonała" : "niedoskonała") << endl;
cout << "496 - " << (czyDoskonala(496) ? "doskonała" : "niedoskonała") << endl;
}