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

Podobne dokumenty