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.