Napisz algorytm do dzielenie liczb, który nie będzie wykorzystywał standardowego operatora dzielenia. Przygotuj rozwiązanie, które będzie mogło obliczyć wynik i resztą dla dowolnych liczb całkowitych.
Operację dzielenia można zastąpić odejmowaniem dzielnika od dzielnej tak długo jak będzie to możliwe. Kiedy dzielna będzie mniejsza od dzielnika to pozostała wartość jest resztą z dzielenia. Innymi słowy, aby podzielić liczbę przez liczbę wystarczy tylko pętla while. Sytuacja staje się nieco trudniejsza w momencie, gdy liczby mogą być dowolnego znaku.
W początkowej wersji algorytmu ograniczmy się do liczb dodatnich. Deklarujemy dodatkowy licznik, który będzie zliczał ile od liczby a odjęliśmy wartości b. Licznik jest wynikiem dzielenia, a końcowa wartość a resztą.
Jednak kiedy dopuścimy liczby ujemne sprawy stają się nieco trudniejsze, ponieważ musimy uwzględnić znaki wartości, ponieważ algorytm oczekuje dwóch dodatnich wartości. Ze względu na to, że pobranie znaku wartości i wyznaczenie modułu możemy napisać specjalną funkcję. Po wywołaniu na wartości a wartość będzie dodatnia, a znak zostanie zwrócony jako 1 lub -1.
Funkcja Podziel() wymaga drobnych modyfikacji, aby obsługiwać liczby ujemne również.
Dodatkowo bardzo ważne jest przekształcenie końcowego wyniku. Przydatne jest tutaj równanie a = w·b + r, gdzie w - wynik dzielenia, a r to reszta. Znak wyniku nie zmienia się jeśli dzielna i dzielnik są tego samego znaku. Z kolei resztajest ujemna wtedy i tylko wtedy, gdy dzielna jest ujemna.
Oto przykładowe dzielenie z wynikiem i resztą:
Dzielna | Dzielnik | Wynik |
---|---|---|
13 | 4 | 3 r. 1 |
-13 | 4 | -3 r. -1 |
13 | -4 | -3 r. 1 |
-13 | -4 | 3 r. -1 |
Poniższy kod wczyta od użytkownika dzielną oraz dzielnik, a następnie wypisze zintepretowany wynik.