Liczba Praktyczna n to taka liczba naturalna dla której wszystkie liczby naturalne mniejsze od niej samej można uzyskać jako sumę dowolnych dzielników właściwych liczby n. W trakcie sumowania wybrany dzielnik można dodać tylko raz.
Liczbą Praktyczną jest 12, ponieważ dzielniki właściwe tej liczby to: {1, 2, 3, 4, 6}. Kolejne wartości mniejsze od 12 można uzyskać następująco:
Liczba | Suma |
---|---|
1 | 1 |
2 | 2 |
3 | 3 lub 2 + 1 |
4 | 4 lub 3 + 1 |
5 | 4 + 1 lub 3 + 2 |
6 | 6 lub 4 + 2 lub 3 + 2 + 1 |
7 | 4 + 3 lub 4 + 2 + 1 lub 6 + 1 |
8 | 6 + 2 lub 4 + 3 + 1 |
9 | 6 + 3 lub 6 + 2 + 1 lub 4 + 3 + 2 |
10 | 6 + 4 lub 4 + 3 + 2 + 1 |
11 | 6 + 4 + 1 lub 6 + 3 + 2 |
Jedyną nieparzystą liczbą Praktyczną jest 1. Jest to spowodowane faktem, że każda liczba nieparzysta ma tylko nieparzyste dzielniki. Z tego powodu nie jest możliwe uzyskanie sumy 2 dla każdej liczby nieparzystej.
Na początku algorytm może odrzucić wszystkie liczby nieparzyste prócz 1. Jednak dla liczb parzystych na początek należałoby zebrać wszystkie dzielniki właściwe liczby. Następnie w pętli dla każdej mniejszej wartości od zadanej liczby sprawdzimy czy można zsumować dzielniki do tej wartości.
Podczas sumowania należy pamiętać, że należy sumować najpierw jak największe wartości, a potem coraz mniejsze. Dzięki temu zagwarantowane jest znalezienie odpowiedzi czy taka suma istnieje w czasie liniowym. Gdyby sumować od najmniejszych wartości póki można to mogłoby się okazać, że nie ma już możliwości dodania większego dzielnika.
Przedstawiona funkcja czyPraktyczna() sprawdza czy podana liczba a jest liczbą Praktyczną, a wynikiem jest wartość logiczna.
(2. - 6.) Na początku algorytmu eliminowane są przypadki, gdy a jest nieparzyste. Następnie (7. - 12.) generowana jest lista dzielników właściwych a. Dzielniki są zapisywane od największego do najmniejszego. Ostatni etap polega na (13. - 23.) znalezieniu takiego i, aby nie można było do tej wartości wysumować dzielników właściwych. W każdej iteracji k jest przypisywana wartość do wysumowania. Potem dla każdego dzielnika o ile jest mniejszy od aktualnej wartości k to jest on odejmowany od k. Jeśli na koniec k jest różne od 0 oznacza to, że danej wartości nie można uzyskać.
Poniższy fragment kodu wypisuje wszystkie liczby Praktyczne z zakresu [1, 100]