Dziś prezentacja kolejnego algorytmu. Tym razem będziemy sprawdzać, czy podana liczba jest liczbą doskonałą.Dziś zaprezentuję Ci najprostsze rozwiązanie problemu, które może przyprawić Twój komputer, bądź Twojego profesora o siódme poty.Ale czasem z naszego algorytmu zrobimy ferrari pod kątem prędkości w swojej dziedzinie. Pytanie, czy da się prościej i szybciej? Na pewno. Nie rozpisując się dłużej przejdźmy do działania.
Najpierw trochę teorii.
O liczbie możemy powiedzieć, że jest doskonała jeżeli suma jej dzielników, bez niej samej jest sobie równa. W praktyce wygląda to mniej więcej tak…
1. Wybierzmy dowolną liczbę naturalną – dla przykładu wybieram 6, bo jest to pierwsza z liczb doskonałych.
2. Wypisujemy jej dzielniki:
dla 6 to odpowiednio : {1,2,3,6}
3. Sprawdzamy, czy jest doskonała.
Czy 1+2+3=6 ? – Tak, a więc 6 jest liczbą doskonałą.
Frontalny atak na zadanie
My widząc liczbę już mniej więcej wiemy jakie kroki podjąć i które mniejsze są dzielnikami. Pisząc jednak algorytm nie jesteśmy w stanie przewidzieć zadanej wartości, więc oczywistym sposobem wydaje się toporne sprawdzanie, które z liczb naturalnych dadzą resztę z dzielenia 0.Wyglądałoby to mniej więcej tak:
1.Wybierz liczbę dowolną naturalną n.
– określmy licznik, jako x, ,
2.Dopóki x<n-1 sprawdź, czy n div x = 0 ( div reszta z dzielenia )
– jeżeli tak dodaj nam do tablicy x
– jeżeli nie biegnij dalej
3.Zsumuj wszystkie elementy tablicy.
4.Jeżeli suma elementów tablicy jest równa n napisz, że „n jest liczbą doskonałą”, w innym wypadku napisz „n nie jest liczbą doskonała”.
Powoli do skutku można dojść tym sposobem, dla 5, 9, 15, 29, może 56, a nawet 100, czy 1000 – muszę kiedyś sprawdzić na swojej maszynie. Swoją drogą załączam kod algorytmu, o którym wspominałem.
Algorytm w C++
#include <iostream> #include <cstdlib> using namespace std; int n, p; bool czy(int n); int main() { cin >> n; if(czy(n)==1) cout << "tak" << endl; else cout << "nie" << endl; system("PAUSE"); return 0; } bool czy(int n) { for(int x=2; x < n; x++) { if(n%x == 0) p=p+x; } if(n==p)return 1; }
Podsumowując – cel został pomyślnie osiągnięty, fakt – komputer będzie się pocił, gdy sprawdzający poprosi o większe wartości i większe i większe… to niestety nas nie interesuje w tym momencie. Co do nas należało wykonaliśmy. Brawo za cel, ujemne punkty za styl.
Podczas kolejnych wpisów postaram się przebudować, przerobić ten kod, abyśmy osiągnęli sukces zachowując wysoką wydajność maszyny.