Strona główna » Algorytmy » Artykuły » Dzielenie bez Operatora
 

Dzielenie bez Operatora

Cel

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.

Algorytm

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.

Implementacja

Liczby Dodatnie

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ą.

C++C#
Python
  1. def Podziel(a, b):
  2.   c = 0
  3.   while a >= b:
  4.     c += 1
  5.     a -= b
  6.   return c, a

Liczby Całkowite

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.

C++C#
Python
  1. def ModulZnak(a):
  2.   wynik = a > 0
  3.   return abs(a), 1 if wynik else -1

Funkcja Podziel() wymaga drobnych modyfikacji, aby obsługiwać liczby ujemne również.

C++C#
Python
  1. def Podziel(a, b):
  2.   c = 0
  3.   a, znak1 = ModulZnak(a)
  4.   b, znak2 = ModulZnak(b)
  5.   while a >= b:
  6.     c += 1
  7.     a -= b
  8.   return c*znak1*znak2, a*znak1

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ą:

DzielnaDzielnikWynik
1343 r. 1
-134-3 r. -1
13-4-3 r. 1
-13-43 r. -1

Testowanie funkcji

Poniższy kod wczyta od użytkownika dzielną oraz dzielnik, a następnie wypisze zintepretowany wynik.

C++C#
Python
  1. print("Podaj liczbe do podzielenia:\n a = ", end="")
  2. a = int(input())
  3. print("Podaj dzielnik:\n b = ", end="")
  4. b = int(input())
  5. wynik, reszta = Podziel(a, b)
  6. print(a, "/", b, "=", wynik, end="")
  7. if reszta > 0:
  8.   print(" r.", reszta)