Dziś programujemy
Zadanie 1
Zaprogramować jako funkcję algorytm E (algorytm Eukildesa) wyznaczania największego wspólnego dzielnika dwu liczb
i (całkowitych, większych od zera) opisany w następujący sposób:Niech
będzie resztą z dzielenia przez (r = m % n;
)1Jeżeli
— największym wspólnym dzielnikiem jest ;W przeciwnym razie
przejdź do kroku 1.
Uwagi:
- W MATLABie operację modulo realizuje funkcja
mod(a, b)
wyliczająca operacjęa % b
Schemat blokowy algorytmu
Schemat blokowy algorytmu E
Zadanie 2
Zaprogramować jako funkcję algorytm B (binarny2 algorytm Eukildesa) wyznaczania największego wspólnego dzielnika dwu liczb
Przyjmij
, a następnie powtarzaj operacje: , , zero lub więcej razy do chwili gdy przynajmniej jedna z liczb i przestanie być parzysta.Jeśli
jest nieparzyste to przyjmij i przejdź do kroku 4. W przeciwnym razie przyjmij .(W tym miejscu
jest parzyste i różne od zera).Przyjmij
.Jeśli
jest parzyste to przejdź do 3.Jeśli
, to przyjmij , w przeciwnym razie przyjmij .Przyjmij
. Jeśli to wróć do kroku 3. W przeciwnym razie algorytm zatrzymuje się z wynikiem .
Jak sprawdzić czy liczba jest parzysta?
Schemat blokowy algorytmu
Zwracam uwagę, iż w oryginalnym algorytmie pojawiają się określenia
- przejdź do kroku 4 (krok 2)
- przejdź do 3 (krok 4)
- wróć do kroku 3 (krok 6)
Polecenia te żądają zmiany kolejności wykonywania kodu i mogłyby być realizowane przez funkcję skoku. (Jest taka zarówno w C jak i C++).
Funkcji skoku nie ma w MATLABie
Trzeba algorytm zmodyfikować w taki sposób, żeby nie zmienić idei samego algorytmu i pozbyć się (niedostępnej w MATLABie) instrukcji goto
.
Uwagi pomocnicze
- Sprawdzić poprawność działania algorytmu korzystając z funkcji MATLABa
gcd()
- Jakiego typu danych powinniśmy użyć do obliczeń? (oczekuję dyskusji w sprawozdaniu)