Liczba doskonała jest liczbą naturalną, która jest sumą wszystkich swoich dzielników właściwych.
Dzielnik właściwy to taki dzielnik, który jest mniejszy od liczby, którą dzielimy.
Przykładowo weźmy liczbę 6, 6 = 3 + 2 + 1, więc jest liczbą doskonałą. Liczba 6 jest najmniejszą liczbą doskonałą. Po niej kolejną liczbą doskonałą jest 28, ponieważ 28 = 14 + 7 + 4 + 2 + 1.
Napisz program, który na wejściu otrzyma jedną dodatnią liczbę całkowitą, a na wyjście wypisze PRAWDA jeśli wprowadzona liczba jest doskonała, a w innym przypadku FAŁSZ. Przykładowo dla wprowadzonej liczby 496:
Przed rozpoczęciem pisania funkcji warto zauważyć, że skoro dzielniki mają być właściwe to znaczy, że nie żaden nie może być równy liczbie, która została wprowadzona czyli największy możliwy dziennik będzie połową liczby wprowadzonej.
(1.) Funkcja przyjmuje jeden argument, którym jest liczba do sprawdzenia czy jest doskonała. Funkcja zwraca wartość typu bool. (2.) Deklarujemy zmienną suma, która będzie nam potrzebna do sumowania kolejnych składników. (3.) Sprawdzamy wszystkie liczby w przedziale i (4.) jeśli i-ta liczba jest dzielnikiem argumentu n to (5.) dodajemy ją do sumy. W ten sposób uzyskujemy sumę wszystkich składników. Pozostaje nam (6.) sprawdzić czy suma jest równa n i zwrócić wynik tego porównania.
Z przyczyn testowych czy ciekawskich warto tak napisać tę funkcję, aby wypisała nam na ekran wszystkie dzielniki i na koniec ich sumę. Przykładowo dla liczby 28 zostanie wypisany jej rozkład:
Zauważmy, że jeden dzieli każdą liczbę naturalną, więc zmienna suma może mieć ustawioną wartość początkową 1 i możemy rozpocząć poszukiwania dzielników od 2. To uprości nam również napisanie funkcji, która wypisze wszystkie dzielniki.
(2.) Ustalamy suma na 1, więc (3.) możemy wypisać 1 na konsole jako dzielnik. (4.) Szukamy dzielników, ale tym razem w zakresie . (5.) Jeśli i dzieli n to (6.) wypisujemy dzielnik na ekran i (7.) zwiększamy suma o i. (9.) Na koniec wypisujemy sumą dzielników. (10.) Zwracamy wynik porównania suma z n.
Euler udowodnił, że każda liczba doskonała parzysta ma postać , gdzie jest liczbą pierwszą. Zachodzi tu jednoznaczna odpowiedniość z liczbami pierwszymi Mersenne'a.
Wykorzystując podane informacje napiszemy funkcję, która zwróci kolejne n liczb doskonałych wyprowadzonych przy pomocy metody Euklidesa. Będziemy tutaj potrzebowali funkcji, która sprawdzi czy liczba jest pierwsza:
Wyjaśnienie do kodu znajduje się w artykule o liczbach pierwszych.
Funkcja wypiszDoskonale() przyjmie jeden argument a, który określi ile kolejnych liczb doskonałych mamy wypisać. Funkcja nie zwraca nic, ponieważ liczby będziemy wypisywać bezpośrednio na ekran.
Poniższa funkcja main() wczyta od użytkownika liczbę, a następnie wypisze na ekran czy liczba jest dokonała razem z dowodem. W drugiej części program wypisze n liczb doskonałych na podstawie wczytanej liczby.
Dopisz funkcję czyDoskonalaDowod2() na podstawie czyDoskonalaDowod(), która wypisze dzielniki od największego do najmniejszego.
Dopisz funkcję wypiszDoskonale2() na podstawie wypiszDoskonale(), która rozpocznie wypisywanie liczb doskonałych od określonej liczby m. Nagłówek funkcji powinien wyglądać tak:
Gdzie a określa ile kolejnych liczb doskonałych większy lub równych od.
Dopisz kolejną funkcję wypiszDoskonaleEuklides(), która wypisze a kolejnych liczb doskonałych. na podstawie poniższej informacji:
Euklides znalazł sposób na obliczanie liczb doskonałych parzystych: należy sumować kolejne potęgi dwójki, aż któraś z sum okaże się liczbę pierwszą i wtedy należy ostatni dodany składnik pomnożyć przez przedostatni i otrzymamy liczbę doskonałą.