Zadanie 1

Wiązka zadań Binarny fraktal Fibonacciego

Ciąg Fibonacciego to ciąg liczb naturalnych określony rekurencyjnie w sposób następujący: F1=1, F2=1, a każdy następny element ciągu jest sumą dwóch poprzednich, czyli:

F n = { 1 dla  n = 1 1 dla  n = 1 F n 1 + F n 2 dla  n > 2

Binarny fraktal Fibonacciego to dwuwymiarowa tablicatablicatablica, zawierająca w kolejnych wierszach binarne zapisy kolejnych liczb Fibonacciego, gdzie każde zero w zapisie zastąpiono białym kwadratem, a każdą jedynkę czarnym kwadratem (Rys.1). Wszystkie binarne zapisy powinny składać się z jednakowej liczby cyfr, czyli do zapisów krótszych niż najdłuższy należy dodać zera wiodące.

Przykład binarnego fraktala dla pierwszych 10 liczb Fibonacciego:

R1IDCqbDriJlD
Rys.1. Fraktal binarny dla pierwszych 10 liczb Fibonacciego.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Napisz program komputerowy, za pomocą którego uzyskasz odpowiedzi do poniższych zadań. Rysunek fraktala (zadanie 1.3) wykonaj, wykorzystując dostępne narzędzia informatyczne. Odpowiedzi do poszczególnych zadań zapisz w pliku tekstowym o nazwie wyniki.txt, natomiast rysunek fraktala w pliku fraktal.xxx, gdzie xxx oznacza rozszerzenie pliku, w którym zapisany jest obraz fraktala.

Zadanie 1.1

Podaj wartości FIndeks dolny 10, FIndeks dolny 20, FIndeks dolny 30, FIndeks dolny 40. Zapisz każdą z liczb w osobnym wierszu.

Zadanie 1.2

Znajdź wszystkie liczby pierwsze wśród liczb FIndeks dolny 1, FIndeks dolny 2, …, FIndeks dolny 40. Zapisz każdą z liczb w osobnym wierszu.

Zadanie 1.3

Dla pierwszych 40 liczb Fibonacciego utwórz binarny fraktal Fibonacciego:

  • Wypisz reprezentację binarną wszystkich liczb Fibonacciego od FIndeks dolny 1 do FIndeks dolny 40.

  • Wyrównaj długości reprezentacji binarnych wszystkich liczb Fibonacciego od FIndeks dolny 1 do FIndeks dolny 40 i na ich podstawie sporządź obraz binarnego fraktala Fibonacciego.

Zadanie 1.4

Podaj w zapisie binarnym wyrazy ciągu Fibonacciego z zakresu od FIndeks dolny 1 do FIndeks dolny 40, które w tym zapisie mają dokładnie 6 jedynek.

Wiązka zadań została opracowana przez CKE i pojawiła się w zbiorze zadań maturalnych z informatyki jako zadanie 67. Cały zbiór można znaleźć na stronie internetowej Centralnej Komisji Egzaminacyjnej.

Praca domowa

Przedstaw rozwiązanie zadania w postaci programu w języku C++, Java lub Python.

Rozwiązanie

Na egzaminie maturalnym uczniowie mają swobodę wyboru języka programowania. Z tego powodu rozwiązanie zadania przedstawimy w pseudokodzie. Twoim zadaniem jest napisanie kodu w języku, w którym programujesz.

Zadanie 1.1

Rozwiązanie pierwszego podpunktu sprowadza się do zapisania algorytmu wyznaczania kolejnych wyrazów ciągu Fibonacciego. Skorzystamy z iteracyjnej wersji algorytmu, używającej pomocniczych zmiennych, przechowujących dwa wcześniejsze wyrazy ciągu. Jednak nic nie stoi na przeszkodzie, by wykorzystać wersję rekurencyjną algorytmu.

Linia 1. F1 ← 1. Linia 2. F2 ← 1. Linia 3. dla i znak równości 3 przecinek 4 przecinek kropka kropka kropka przecinek 40 wykonuj dwukropek. Linia 4. pom ← F1. Linia 5. F1 ← F2. Linia 6. F2 ← pom plus F1. Linia 8. jeżeli i mod 10 znak równości 0 dwukropek. Linia 9. wypisz F2.
  1. Inicjujemy dwa pierwsze wyrazy ciągu Fibonacciego. [linie kodu 1, 2]

  2. Zapisujemy pętlę dlainstrukcja dlapętlę dla, wyliczającą kolejne wyrazy ciągu, aż do czterdziestego. [linie kodu 3‑6]

  3. Jeżeli właśnie obliczyliśmy wyraz ciągu, którego numer jest podzielny przez 10, to wypisujemy go. [linie kodu 8, 9]

Zadanie 1.2

Zmodyfikujemy rozwiązanie pierwszego podpunktu – zamiast wypisywania wyrazów ciągu o konkretnych numerach, każdy z obliczonych wyrazów będziemy sprawdzać pod kątem „bycia na pierwszym miejscu”. Zapiszmy funkcjęfunkcjafunkcję stwierdzającą, czy liczba podana jako argumentargument funkcjiargument jest liczbą pierwszą:

Linia 1. funkcja czyPierwsza otwórz nawias okrągły liczba zamknij nawias okrągły. Linia 2. jeżeli liczba otwórz nawias ostrokątny 2 dwukropek. Linia 3. zwróć fałsz. Linia 4. dla i znak równości 2 przecinek 3 przecinek kropka kropka kropka przecinek pierwiastekCałkowity otwórz nawias okrągły liczba zamknij nawias okrągły dwukropek. Linia 5. jeżeli liczba mod i znak równości 0 dwukropek. Linia 6. zwróć fałsz. Linia 7. zwróć prawdę.
  1. Zapisujemy nagłówek funkcji. [linia kodu 1]

  2. Jeżeli liczba jest mniejsza od 2 (0 lub 1), nie jest liczbą pierwszą, zatem zwracamy fałsz. [linie kodu 2, 3]

  3. Sprawdzamy podzielność argumentu funkcji przez kolejne liczby, aż do jego pierwiastka. W przypadku wystąpienia podzielności, zwracamy fałsz. [linie kodu 4‑6]

  4. Jeżeli pętlą zakończyła się bez zwrócenia fałszu, liczba dzieli się tylko przez 1 i samą siebie, zatem jest liczbą pierwszą i możemy zwrócić prawdę. [linia kodu 7]

Linia 1. F1 ← 1. Linia 2. F2 ← 1. Linia 3. dla i znak równości 3 przecinek 4 przecinek kropka kropka kropka przecinek 40 wykonuj dwukropek. Linia 4. pom ← F1. Linia 5. F1 ← F2. Linia 6. F2 ← pom plus F1. Linia 8. jeżeli czyPierwsza otwórz nawias okrągły F2 zamknij nawias okrągły dwukropek. Linia 9. wypisz F2.

Przedstawiona funkcja jest analogiczna do rozwiązania pierwszego podpunktu zadania. W linii 8 zamiast sprawdzania, czy dany numer wyrazu ciągu jest podzielny przez 10, sprawdzamy, czy jest liczbą pierwszą.

Zadanie 1.3

Podpunkt trzeci zadania podzielimy na dwie części. W pierwszej, korzystając z rozwiązania pierwszego podpunktu, wyliczymy pierwsze 40 wyrazów ciągu Fibonacciego, przekonwertujemy je do postaci binarnej i zapiszemy w tablicy. W drugiej, znając długość najdłuższego obliczonego wyrazu zapisanego binarnie, dopełnimy krótsze od niego wyrazy zerami z przodu i wypiszemy poprawione wyrazy.

Zapiszmy funkcję konwertującą wyrazy ciągu Fibonacciego do postaci binarnej. W związku z koniecznością dopisywania zer na początek krótszych liczb w dalszej części zadania, przekonwertowane liczby zapiszemy jako łańcuchy znaków:

Linia 1. funkcja konwertuj otwórz nawias okrągły liczba zamknij nawias okrągły dwukropek. Linia 2. postacBinarna ← cudzysłów cudzysłów. Linia 3. dopóki liczba zamknij nawias ostrokątny 0 przecinek wykonuj dwukropek. Linia 4. jeżeli liczba mod 2 znak równości 0 dwukropek. Linia 5. postacBinarna ← cudzysłów 0 cudzysłów plus postacBinarna. Linia 6. w przeciwnym wypadku dwukropek. Linia 7. postacBinarna ← cudzysłów 1 cudzysłów plus postacBinarna. Linia 8. liczba ← liczba div 2. Linia 9. zwróć postacBinarna.
  1. Zapisujemy nagłówek funkcji oraz pusty łańcuch znaków, do którego będziemy dopisywać kolejne cyfry w trakcie konwersji. [linie 1, 2]

  2. Dopóki argument funkcji jest większy od 0, dzielimy go całkowitoliczbowo przez 2, za każdym razem dopisując resztę z dzielenia na początek postaci binarnej. [linie kodu 3‑8]

  3. Zbudowany łańcuch znaków zwracamy. [linia kodu 9]

Możemy zapisać główną część kodu. Modyfikujemy rozwiązanie z podpunktu pierwszego, zapisując każdą przekonwertowaną liczbę w pomocniczej tablicy. Na koniec sprawdzamy długość ostatniego zapisanego w tablicy wyrazu i dla krótszych wyrazów dopisujemy z przodu 0, a następnie zapisujemy wyrazy do pliku wynikowego.

Linia 1. F1 ← 1. Linia 2. F2 ← 1. Linia 4. Binarne otwórz nawias kwadratowy 0 zamknij nawias kwadratowy ← cudzysłów 1 cudzysłów. Linia 5. Binarne otwórz nawias kwadratowy 1 zamknij nawias kwadratowy ← cudzysłów 1 cudzysłów. Linia 6. dla i znak równości 2 przecinek 3 przecinek kropka kropka kropka przecinek 39 wykonuj dwukropek. Linia 7. pom ← F1. Linia 8. F1 ← F2. Linia 9. F2 ← pom plus F1. Linia 10. Binarne otwórz nawias kwadratowy i zamknij nawias kwadratowy ← konwertuj otwórz nawias okrągły F2 zamknij nawias okrągły. Linia 11. dla i znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek 39 wykonuj dwukropek. Linia 12. różnica ← długość otwórz nawias okrągły Binarne otwórz nawias kwadratowy 39 zamknij nawias kwadratowy zamknij nawias okrągły minus długość otwórz nawias okrągły Binarne otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły. Linia 13. jeżeli różnica zamknij nawias ostrokątny 0 dwukropek. Linia 14. dla j znak równości 0 przecinek 1 przecinek kropka kropka kropka przecinek różnica dwukropek. Linia 15. Binarne otwórz nawias kwadratowy i zamknij nawias kwadratowy ← cudzysłów 0 cudzysłów plus Binarne otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 16. wypisz Binarne otwórz nawias kwadratowy i zamknij nawias kwadratowy.
  1. Oprócz pierwszych wyrazów ciągu Fibonacciego deklarujemy tablicę łańcuchów znaków, która będzie przechowywać wyrazy w postaci binarnej. Dwa pierwsze elementy tablicy wypełniamy od razu, gdyż nie ma dla nich różnicy między systemem binarnym oraz dziesiętnym. [linie kodu 1‑5]

  2. W pierwszej pętli obliczamy kolejne wyrazy ciągu Fibonacciego oraz zapisujemy ich postać binarną do tablicy Binarne[]. [linie kodu 6‑10]

  3. Następnie, dla każdego z wyrazów w postaci binarnej, dopisujemy zera z przodu, aby zrównały się długością z najdłuższym obliczonym wyrazem, a następnie zapisujemy je do pliku wynikowego. [linie kodu 11‑16]

Zadanie 1.4

W ostatnim podpunkcie zadania wykorzystamy zmodyfikowaną funkcję konwertującą z podpunktu trzeciego, przy okazji sprawdzając liczbę jedynek w postaci binarnej.

Linia 1. funkcja konwertuj otwórz nawias okrągły liczba zamknij nawias okrągły dwukropek. Linia 2. postacBinarna ← cudzysłów cudzysłów. Linia 3. liczbaJedynek ← 0. Linia 4. dopóki liczba zamknij nawias ostrokątny 0 przecinek wykonuj dwukropek. Linia 5. jeżeli liczba mod 2 znak równości 0 dwukropek. Linia 6. postacBinarna ← cudzysłów 0 cudzysłów plus postacBinarna. Linia 7. w przeciwnym wypadku dwukropek. Linia 8. postacBinarna ← cudzysłów 1 cudzysłów plus postacBinarna. Linia 9. liczbaJedynek ← liczbaJedynek plus 1. Linia 10. liczba ← liczba div 2. Linia 11. jeżeli liczbaJedynek znak równości 6 dwukropek. Linia 12. wypisz postacBinarna.

Do funkcji wykorzystanej we wcześniejszym poleceniu dodajemy zmienną liczbaJedynek, zwiększaną za każdym razem, gdy w postaci binarnej liczby pojawi się jedynka. Na koniec konwersji sprawdzamy, czy jej wartość jest równa 6. Jeśli tak, wypisujemy postać binarną liczby. W przeciwnym wypadku funkcja kończy się bez żadnego skutku.

Linia 1. F1 ← 1. Linia 2. F2 ← 1. Linia 3. dla i ← 3 przecinek 4 przecinek kropka kropka kropka przecinek 40 wykonuj dwukropek. Linia 4. pom ← F1. Linia 5. F1 ← F2. Linia 6. F2 ← pom plus F1. Linia 7. konwertuj otwórz nawias okrągły F2 zamknij nawias okrągły.
  1. Inicjujemy dwa pierwsze wyrazy ciągu Fibonacciego. [linie kodu 1, 2]

  2. Zapisujemy pętlę dla, wyliczającą kolejne wyrazy ciągu, aż do czterdziestego. [linie kodu 3‑6]

  3. Wywołujemy zmodyfikowaną funkcję konwertującą, która wypisuje liczby w postaci binarnej, tylko jeżeli mają 6 jedynek. [linia kodu 9]

Odpowiedzi do zadania

Zadanie 1.1
Linia 1. 55. Linia 2. 6765. Linia 3. 832040. Linia 4. 102334155.
Zadanie 1.2
Linia 1. 2. Linia 2. 3. Linia 3. 5. Linia 4. 13. Linia 5. 89. Linia 6. 233. Linia 7. 1597. Linia 8. 28657. Linia 9. 514229.
Zadanie 1.3
Linia 1. 000000000000000000000000001. Linia 2. 000000000000000000000000001. Linia 3. 000000000000000000000000010. Linia 4. 000000000000000000000000011. Linia 5. 000000000000000000000000101. Linia 6. 000000000000000000000001000. Linia 7. 000000000000000000000001101. Linia 8. 000000000000000000000010101. Linia 9. 000000000000000000000100010. Linia 10. 000000000000000000000110111. Linia 11. 000000000000000000001011001. Linia 12. 000000000000000000010010000. Linia 13. 000000000000000000011101001. Linia 14. 000000000000000000101111001. Linia 15. 000000000000000001001100010. Linia 16. 000000000000000001111011011. Linia 17. 000000000000000011000111101. Linia 18. 000000000000000101000011000. Linia 19. 000000000000001000001010101. Linia 20. 000000000000001101001101101. Linia 21. 000000000000010101011000010. Linia 22. 000000000000100010100101111. Linia 23. 000000000000110111111110001. Linia 24. 000000000001011010100100000. Linia 25. 000000000010010010100010001. Linia 26. 000000000011101101000110001. Linia 27. 000000000101111111101000010. Linia 28. 000000001001101100101110011. Linia 29. 000000001111101100010110101. Linia 30. 000000011001011001000101000. Linia 31. 000000101001000101011011101. Linia 32. 000001000010011110100000101. Linia 33. 000001101011100011111100010. Linia 34. 000010101110000010011100111. Linia 35. 000100011001100110011001001. Linia 36. 000111000111101000110110000. Linia 37. 001011100001001111001111001. Linia 38. 010010101000111000000101001. Linia 39. 011110001010000111010100010. Linia 40. 110000110010111111011001011.
Zadanie 1.4
Linia 1. 101111001. Linia 2. 10101011000010. Linia 3. 1011010100100000. Linia 4. 10010010100010001.

Słownik

argument funkcji
argument funkcji

element składni w określonym języku programowania, który w wyniku wywołania podprogramu zostaje utożsamiony (skojarzony) z określonym parametrem podprogramu

czynnik pierwszy
czynnik pierwszy

liczba pierwsza, będąca dzielnikiem danej liczby

funkcja
funkcja

wydzielona część kodu, nazywana także podprogramem, wykonująca określone operacje, możliwa do wywołania wiele razy podczas działania programu

instrukcja dla
instrukcja dla

fragment kodu, dla którego zdefiniowana zostaje zmienna iteracyjna; w każdym przejściu instrukcji wartość tej zmiennej jest modyfikowana w pewien określony sposób; w momencie, gdy instrukcja wykona się dla wszystkich podanych wartości zmiennej iteracyjnej, kończy swoje działanie

instrukcja warunkowa
instrukcja warunkowa

element języka programowania, który pozwala na wykonanie rozgałęzienia w programie i tym samym na wykonanie różnych instrukcji, w zależności od tego czy zdefiniowane przez programistę wyrażenie logiczne jest prawdziwe czy fałszywe

parametr funkcji
parametr funkcji

element składni w określonym języku programowania; umożliwia komunikację pomiędzy podprogramem (funkcją) wywołanym a programem wywołującym; parametry określa się w nagłówku podprogramu (przy jego definicji)

tablica
tablica

kontener uporządkowanych danych takiego samego typu; do poszczególnych elementów odnosimy się za pomocą unikatowych indeksów