Jeden z najstarszych algorytmów obliczeniowych – wyznaczanie NWD metodą Euklidesa oraz zastosowanie go do dodawania ułamków zwykłych.
Kołdra patchworkowa powstaje ze zszycia wielu mniejszych kawałków tkanin. Wyobraź sobie, że przygotowujesz projekt małej kołdry o wymiarach 112 × 88 cm, która ma być uszyta z jak największych kwadratowych kawałków równej wielkości. Jakiej długości bok powinien mieć taki kawałek?
Długość boku takiego kwadratu musi być największą możliwą liczbą, która dzieli liczby wyrażające długość i szerokość całej kołdry. Innymi słowy – szukamy największego wspólnego dzielnika liczb 112 i 88. Ponieważ 88 = 8 · 11 oraz 112 = 8 · 2 · 7, odpowiedź wynosi 8 cm.
Największy wspólny dzielnik (NWD) dwóch liczb całkowitych dodatnich a i b to największa liczba całkowita, która jest dzielnikiem obu tych liczb. Jeśli a jest dzielnikiem b, to liczba a jest największym wspólnym dzielnikiem liczb a i b.
O dwóch liczbach, które nie mają wspólnego dzielnika większego od 1, mówi się, że są względnie pierwsze.
Jedno z rozwiązań: szukamy wspólnego dzielnika liczb a i b wśród coraz mniejszych liczb, zaczynając od dzielnika o wartości równej mniejszej z tych liczb. Poszukiwanie NWD zakończy się najpóźniej w momencie, gdy wspólny dzielnik będzie równy 1.
Wróćmy do przykładu z kołdrą 112 × 88 cm. Krok po kroku odcinamy jak największy kwadrat od prostokąta, który powstał w poprzednim kroku. Po pewnej liczbie kroków otrzymamy prostokąt, który jest kwadratem.
| Wymiary prostokąta | Długość boku kwadratu |
|---|---|
| 112 × 88 | 88 |
| 88 × 24 | 24 |
| 64 × 24 | 24 |
| 40 × 24 | 24 |
| 24 × 16 | 16 |
| 16 × 8 | 8 |
| 8 × 8 | koniec |
Obserwacja: NWD(a, b) = NWD(a, b−a) dla a < b. Ta równość jest podstawą algorytmu Euklidesa.
Jeśli w algorytmie Euklidesa jedna liczba jest dużo większa od drugiej, wielokrotnie powtarza się odejmowanie od niej tej samej liczby. Wielokrotne odejmowanie możemy zastąpić wyznaczeniem reszty z dzielenia większej liczby przez mniejszą.
| Wartość zmiennej a | Wartość zmiennej b |
|---|---|
| 196 | 42 |
| 196 % 42 = 28 | 42 |
| 28 | 42 % 28 = 14 |
| 28 % 14 = 0 | 14 |
Wpisz dwie liczby całkowite dodatnie i obserwuj kroki algorytmu Euklidesa (wersja z dzieleniem).
Algorytm naiwny – sprawdzanie dzielników od a do 1
a była mniejsza, a w zmiennej b – większa wartość.
Zastosowano skrótowy zapis zamiany wartości zmiennych: a, b = b, a.
Algorytm Euklidesa – wersja z odejmowaniem
while wartości obu zmiennych a i b są równe
największemu wspólnemu dzielnikowi początkowych wartości a i b. W przypadku liczb,
które nie mają wspólnego dzielnika większego niż 1, funkcja zwraca wartość 1.
Algorytm Euklidesa – wersja z dzieleniem (najszybsza)
Podaj liczbę a: 112Podaj liczbę b: 88NWD(112,88)= 8
Porównanie liczby iteracji – naiwny vs. Euklides (z dzieleniem)
str służy do przekształcania danych na napisy (ciągi znaków).
Operator + pozwala na scalanie napisów i może być wykorzystany np. jako element funkcji print.
Żeby dodać dwa ułamki zwykłe, wystarczy pomnożyć ich mianowniki i dodać liczniki mnożone odpowiednio przez mianowniki:
Aby doprowadzić ułamek do postaci nieskracalnej, wystarczy podzielić liczby e i f przez NWD(e, f).
Specyfikacja problemu dodawania dwóch ułamków
Dane: cztery liczby całkowite – licznik i mianownik jednego ułamka oraz licznik i mianownik drugiego ułamka.
Wynik: dwie liczby całkowite – licznik i mianownik sumy ułamków, zapisane w postaci nieskracalnej.
Kod źródłowy programu Suma ułamków
suma,
która jest funkcją niezwracającą wartości, ponieważ nie zawiera instrukcji return.
Zadaniem tej funkcji jest wykonanie obliczeń i wyświetlenie efektu na ekranie.
Dlatego też w linii 25 znajduje się wywołanie funkcji suma bez funkcji print.
Kalkulator dodawania ułamków