Rozwiązanie
Transkrypt
Rozwiązanie
20.12.2011 Ćwiczenia 5 - rozwiązania Algorytmy i schematy blokowe 1. Dla (bardzo) ambitnych. Podać algorytm tworzenia terminarza rozgrywek ligowych dla k drużyn (liczba k jest parzysta) . Przykładowe rozwiązanie dla k = 6 : 1-6 6-4 2-6 6-5 3-6 2-5 5-3 3-1 1-4 4-2 Wierszy jest 3-4 1-2 4-5 2-3 5-1 k − 1 , każdy wiersz zawiera k par, w żadnym wierszu 2 nie powtarza się żadna liczba, żadna para się nie powtarza. Wskazówka. Można zadanie potraktować jak kolorowanie grafu pełnego (tzn. każde dwa wierzchołki są połączone krawędzią) o k wierzchołkach. Użyć należy k − 1 kolorów, krawędzie mające wspólny wierzchołek muszą mieć różne kolory. Analiza algorytmów 1. wczytaj n wynik=true k=2 dopóki ( k ≤ √(n) ) oraz wynik wykonuj { jeżeli (n%k==0) to wynik=false k=k+1 } Po zakończeniu wykonywania algorytmu zmienna wynik ma wartość true lub false. Dla jakich liczb n ∈ ℕ ∖ {1} = {2,3 ,} zmienna wynik ma wartość true, a dla jakich ma wartość false? (n%k oznacza resztę z dzielenia n/k). Operacje zmiennoprzecinkowe (np. pierwiastkowanie) są relatywnie wolne. W programie komputerowym należałoby √(n) liczyć tylko raz. ... ograniczenie= √(n) dopóki (k<=ograniczenie) oraz wynik wykonuj … Jeżeli liczba naturalna n ma jakiś podzielnik, to ma również podzielnik ≤√ n . Zmienna wynik ma wartość true ⇔ liczba n nie ma podzielnika ≤√ n ⇔ liczba n nie ma żadnego podzielnika ⇔ liczba n jest pierwsza. 2. Dana jest liczba n ∈ ℕ . Co „robi” poniższy algorytm (tzn. jaki jest związek między wartością liczby n a wartością zmiennej logicznej ok)? ok=false p=1 r=1 dopóki p<=n wykonuj { jeżeli p==n to ok=true r=r+2 p=p+r } Ciąg kolejnych wartości zmiennej r, to ciąg kolejnych liczb nieparzystych. Wynika stąd, że ciąg kolejnych wartości zmiennej p, to ciąg kwadratów kolejnych liczb naturalnych. Zatem, zmienna ok ma wartość true ⇔ liczba n jest kwadratem innej liczby naturalnej ⇔ √ n jest liczbą całkowitą. Poprawność algorytmów 1. Dany jest ciąg liczb c = c[1] , c[2] … c[n] i liczba x . d=1 g=n p=1 dopóki d g wykonuj { p=(d+g)/2 //dzielenie całkowite 33 / 4 = 8 jeśli c [ p ]< x to d=p+1 w przeciwnym razie g=p } • • Czy powyższy algorytm jest poprawny (częściowo poprawny) względem warunku początkowego: ciąg c jest niemalejący, tzn. c = c [1 ] ≤ c [2] ≤ … ≤ c [n ] i liczba x znajduje się w ciągu c , tzn. ∃ p , 1 ≤ p ≤ n takie że c [ p ] = x oraz warunku końcowego: liczba p jest najmniejszą taką liczbą, że c [ p ] = x . Jest poprawny. Czy powyższy algorytm jest poprawny (częściowo poprawny) względem warunku początkowego: ciąg c jest niemalejący, tzn. c = c [1 ] ≤ c [2] ≤ … ≤ c [n ] oraz warunku końcowego: liczba p jest najmniejszą taką liczbą, że c [ p ] = x . Nie jest nawet częściowo poprawny. Dla ciągu dwuelementowego c = 1, 4 oraz liczby x = 5 algorytm zwróci p = 1 . 2. Dany jest ciąg liczb c = c [1 ] ,… , c [n] ∀1 ≤ i ≤ n c [i] = 0∨c [i ] = 1 . znaleziono=false dopóki nie znaleziono wykonuj { i=losowo wybrana naturalna z przedziału [1,n] jeśli c[i]==0 to znaleziono=true } Czy powyższy algorytm jest poprawny (częściowo poprawny) względem warunku końcowego: c [i] = 0 ? Algorytm jest częściowo poprawny, nie jest poprawny. Jeżeli w ciągu c nie ma liczby 0, to wykonywanie algorytmu nigdy się nie skończy. 3. Dany jest ciąg liczb c = c [1 ] ,… , c [n] liczb dodatnich. p=2 dopóki c[p]>=c[1] oraz p<=n wykonuj { p=p+1 } Czy powyższy algorytm jest poprawny względem warunku początkowego: c [n ] ≤ c [1] i warunku końcowego: c [ p ] jest pierwszą liczbą w ciągu c spełniającą nierówność c [ p ] < c [1] ? • Czy powyższy algorytm jest poprawny względem warunku początkowego: c [ n] < c [1] i warunku końcowego: c [ p ] jest pierwszą liczbą w ciągu c spełniającą nierówność c [ p ] < c [1] ? • Czy powyższy algorytm jest poprawny względem warunku początkowego: c [1] + ... + c [ n] < n⋅c [1] i warunku końcowego: c [ p ] jest pierwszą liczbą w ciągu c spełniającą nierówność c [ p ] < c [1] ? Algorytm będzie poprawny, jeżeli warunek początkowy zapewnia, że w ciągu c jest wyraz mniejszy od c[ 1] . Jest tak w drugim i trzecim przypadku, nie jest w pierwszym. 4. Dane są liczby x ∈ ℝ i n ∈ ℤ = {… ,−3,−2,−1,0 ,1 ,2 ,3 …} . • wynik=x i=2 dopóki i<=n wykonuj { wynik=wynik*x i=i+1 } • Czy powyższy algorytm jest poprawny względem warunku • początkowego n ≥ 1 i warunku końcowego wynik = x n ? Tak. Czy powyższy algorytm jest poprawny względem warunku początkowego n ≥ 0 i warunku końcowego wynik = x n ? Nie jest poprawny, jeżeli n = 0 , to zmienna wynik ma wartość x , a powinna mieć wartość 1 ( x 0 = 1 ).