Weźmy dwie dowolne liczby całkowite a i b. b jest dzielnikiem a wtedy i tylko wtedy, gdy iloraz a i b też jest liczbą całkowitą.
Dzielenie małych liczb nie jest problematyczne. Problemy pojawiają się z dużymi liczbami. Jednak jest szereg sztuczek, które potrafią pomóc, aby szybko określić czy liczba a dzieli się przez b. Tego typu sztuczki stosuje się raczej podczas liczenia na kartce niż podczas pisania programu, ponieważ moc komputerów pozwala na bezpośrednio sprawdzanie reszty z dzielenia a przez dowolne b tak jak to zostało pokazane poniżej:
Najprostsza i typowa implementacja wygląda następująca:
Ostatnia liczba jest jedną z podanych na liście {0, 2, 4, 6, 8}.
Jednak można tą regułę sformułować jako: ostatnia liczba jest parzysta:
Rzadko spotykanym, ale poprawnym rozwiązaniem w przypadku sprawdzania dzielenia przez dwa są operacje na bitach. Używając koniunkcji na podanej liczbie oraz 1 otrzymujemy tylko 1 bit, który odpowiada za parzystość. Jest to zdecydowania najszybsza metoda na sprawdzenie parzystości - nie jest wykonywane dzielenie.
Suma cyfr jest podzielna przez 3.
W podanym przykładzie (2.) deklarujemy dodatkową zmienną s, która odpowiada za sumę cyfr oraz (3.) która pobiera ostatnią cyfrę, dodaje do sumy i ucina ją i tak w kółko, aż liczba osiągnie 0. Na sam koniec (6.) sprawdzamy podzielność sumy przez 3.
Zadanie możemy rozwiązać metodą rekurencyjną. Najprostsza implementacja wyglądałaby tak:
Dwa poprzednie rozwiązania działają, ale mogą być niestabilne - w obu wciąż może dojść do próby dzielenia większej liczby niż to co przewiduje najbardziej pojemna zmienna. Można to poprawić dodając dodatkowo warunek, że jeżeli liczba jest większa od 10 to ma ponownie zsumować cyfry, aż uzyskamy liczbę mniejszą niż 10.
Ostatnie dwie liczby są podzielne przez 4.
Ostatnia liczba jest jedną z podanych na liście {0, 5}.
Jednak tak samo jak w przypadku sprawdzania podzielności przez 2 - o wiele lepiej jest sprawdzić pobraną cyfrę funkcją modulo:
6 to liczba złożona 6 = 2 * 3, więc musi być podzielna przez 2 i 3. Najlepszym sposobem jest wykorzystanie dotychczas stworzonych funkcji:
Podwojona ostatnia cyfra i odjęta od reszty liczby da 0 lub liczbę podzielną przez 7.
Definicja podzielności jest prawidłowa, ale wystarczy ją nieco uogólnić, aby poprawić kod. W przypadku 0%7 zawsze otrzymamy 0:
Trzy ostatnie liczby muszą być podzielne przez 8. Biorąc pod uwagę podzielność przez 4 łatwo zauważyć, że dla podzielności 2n należy pobrać n ostatnich cyfr i sprawdzić ich podzielność przez 2n. Wtedy dla podzielności przez 8 kod będzie wyglądał następująco:
Suma cyfr liczby jest podzielna przez 9. Warto tutaj wykorzystać szkielet funkcji stworzony na potrzeby sprawdzenia podzielności przez 3 i zmianę w (7.) linijce sprawdzenia podzielności.
Do wykonania tego zadania można wykorzystać nie tylko metodę iteracji, ale również rekurencji:
Ostatnia cyfra to 0. Kod powinien być oczywisty:
Suma co drugiej liczby i odjęcie sumy pozostałych cyfry da 0 lub liczbę podzielną przez 11.
Wykorzystamy tu szkielet funkcji na podzielność przez 3, ale dodamy drugą zmienną zliczającą oraz zmienną logiczną, która będzie wskazywała do której zmiennej należy dodać aktualnie cyfrę.
Jest to moment w którym możemy wykorzystać znajomość funkcji swap(), aby co pętle zmieniać pozycję zmiennych. Dzięki temu nie musimy deklarować zmiennej logicznej i pisać dwóch linijek na dodawanie.
Z drugiej strony rozwiązywanie rekurencyjne pozwala na zamianę miejscami zmiennych przy kolejnych wywołaniach dzięki czemu kod staje się jeszcze bardziej przejrzysty:
Liczba jest podzielna przez 3 i 4. Tutaj warto zwrócić uwagę, że 12 jest kolejną nie pierwszą liczbą co powoduje, że należy wywołać odpowiednie testy na podzielność przez liczby pierwsze.
Podsumowując, istnieje wiele sposobów na sprawdzanie podzielności. Wiele z nich można zastosować mając liczbę przechowywaną w postaci łańcuchu znaków. Dla chętnych, w celu sprawdzenia poprawności rozwiązań zamieszczam cały kod źródłowy.