{"id":"informatyka-2017-maj-matura-rozszerzona/zad/2.1","paper_id":"informatyka-2017-maj-matura-rozszerzona","number":"2.1","points":2,"ptype":"open","subject":"informatyka","category":"matura","year":2017,"month":"maj","level":"rozszerzona","text":"Zadanie 2.1. (0-2)\nUzupełnij tabelę - podaj wartość licz(x) dla podanych argumentów x.\nx\nlicz(x)\n11\n2\n13\n21\n32\nMiejsce na obliczenia\nMIN_1R","answer":null,"answer_text":"Zadanie 2.1. (0-2)\nIII. Rozwiązywanie problemów\ni podejmowanie decyzji […],\nz zastosowaniem podejścia algorytmicznego.\n5) posługuje się podstawowymi technikami\nalgorytmicznymi;\n9) stosuje rekurencję w prostych sytuacjach\nproblemowych\n16) opisuje własności algorytmów na\npodstawie ich analizy;\n17) ocenia zgodność algorytmu ze\nspecyfikacją problemu;\nSchemat punktowania\n2 p. - za podanie trzech poprawnych wartości.\n1 p. - za podanie dwóch poprawnych wartości.\n0 p. - za podanie jednej poprawnej wartości albo za brak odpowiedzi.\nPoprawna odpowiedź:\nx\nlicz(x)\n13\n2\n21\n1\n32\n-4","solution":"## Poprawna odpowiedź\n\n| x | licz(x) |\n| 11 | 2 |\n| 13 | **2** |\n| 21 | **1** |\n| 32 | **-4** |\n\n## Sposób 1 - kluczowa obserwacja\n\nFunkcja `licz(x)` to **suma cyfr binarnych z modyfikowaną wagą**: każda jedynka w zapisie binarnym x daje +1, każde zero daje -1, a najstarszy bit (zawsze 1) startuje od wartości 1. Krótko: **licz(x) = (liczba jedynek w bin(x)) - (liczba zer w bin(x), pomijając wiodące zera) + ** Lepiej: rozwińmy rekurencję.\n\nDla x = 1: zwraca 1.\nDla x > 1: w := licz(x div 2); jeśli x mod 2 = 1 (czyli ostatni bit jest 1) → zwróć w+1; w przeciwnym razie (ostatni bit 0) → zwróć w-1.\n\nWięc każda cyfra binarna x (czytana od najmłodszej, ale pomijając najstarszą - ta startuje wartością 1):\n- bit 1 → dodaje +1\n- bit 0 → odejmuje 1\n\n**Wzór:** licz(x) = 1 + (liczba_jedynek_w_bin(x) - 1) - (liczba_zer_w_bin(x)) = liczba_jedynek - liczba_zer.\n\nUwaga: najstarszy bit (zawsze 1 dla x > 0) liczy się raz, ale w sumie wszystkie jedynki dają +1 każda, zera dają -1 każda. Plus startowa wartość 1 z licz(1) Sprawdźmy.\n\n## Sposób 2 - symulacja krok po kroku\n\n### x = 11 (kontrola)\n11 w binarnym: **1011**\n- licz(11): 11 mod 2 = 1 → w = licz(5), wynik = w + 1\n- licz(5): 5 mod 2 = 1 → w = licz(2), wynik = w + 1\n- licz(2): 2 mod 2 = 0 → w = licz(1), wynik = w - 1\n- licz(1) = 1\n- licz(2) = 1 - 1 = 0\n- licz(5) = 0 + 1 = 1\n- licz(11) = 1 + 1 = **2** ✓\n\n### x = 13\n13 w binarnym: **1101**\n- licz(13): 13 mod 2 = 1 → w = licz(6), wynik = w + 1\n- licz(6): 6 mod 2 = 0 → w = licz(3), wynik = w - 1\n- licz(3): 3 mod 2 = 1 → w = licz(1), wynik = w + 1\n- licz(1) = 1\n- licz(3) = 1 + 1 = 2\n- licz(6) = 2 - 1 = 1\n- licz(13) = 1 + 1 = **2** ✓\n\n### x = 21\n21 w binarnym: **10101**\n- licz(21): 21 mod 2 = 1 → w = licz(10), wynik = w + 1\n- licz(10): 10 mod 2 = 0 → w = licz(5), wynik = w - 1\n- licz(5): 5 mod 2 = 1 → w = licz(2), wynik = w + 1\n- licz(2): 2 mod 2 = 0 → w = licz(1), wynik = w - 1\n- licz(1) = 1\n- licz(2) = 1 - 1 = 0\n- licz(5) = 0 + 1 = 1\n- licz(10) = 1 - 1 = 0\n- licz(21) = 0 + 1 = **1** ✓\n\n### x = 32\n32 w binarnym: **100000**\n- licz(32): 32 mod 2 = 0 → w = licz(16), wynik = w - 1\n- licz(16): 16 mod 2 = 0 → w = licz(8), wynik = w - 1\n- licz(8): 8 mod 2 = 0 → w = licz(4), wynik = w - 1\n- licz(4): 4 mod 2 = 0 → w = licz(2), wynik = w - 1\n- licz(2): 2 mod 2 = 0 → w = licz(1), wynik = w - 1\n- licz(1) = 1\n- licz(2) = 1 - 1 = 0\n- licz(4) = 0 - 1 = -1\n- licz(8) = -1 - 1 = -2\n- licz(16) = -2 - 1 = -3\n- licz(32) = -3 - 1 = **-4** ✓\n\n## Sposób 3 - wzór ogólny\n\nDla x w zapisie binarnym mającym `j` jedynek i `z` zer:\n**licz(x) = j - z**\n\nWeryfikacja:\n- 11 = 1011: j=3, z=1 → 3-1 = 2 ✓\n- 13 = 1101: j=3, z=1 → 3-1 = 2 ✓\n- 21 = 10101: j=3, z=2 → 3-2 = 1 ✓\n- 32 = 100000: j=1, z=5 → 1-5 = **-4** ✓\n\n**Implementacja Python (weryfikacja):**\n```python\ndef licz(x):\nif x == 1:\nreturn 1\nw = licz(x // 2)\nif x % 2 == 1:\nreturn w + 1\nelse:\nreturn w - 1\n\nfor x in [11, 13, 21, 32]:\nprint(x, licz(x)) # 11 2, 13 2, 21 1, 32 -4\n\n## Reference algorytmiczny - rekurencja binarna\n\n> Reference - rekurencja po cyfrach binarnych:\n> - Wzorzec: `f(x) = f(x div 2) ± coś` rozwija cyfry binarne x.\n> - Głębokość rekurencji = liczba bitów x = ⌊log₂ x⌋ + 1.\n> - Funkcja licz: zlicza różnicę między liczbą jedynek a zer w bin(x).\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 2.1, max 2 pkt):\n> - **2 pkt** - za 3 poprawne wartości (z 3 wymaganych: 13, 21, 32)\n> - **1 pkt** - za 2 poprawne\n> - **0 pkt** - za 1 poprawną albo brak\n\n## Typowe pułapki\n\n- **Znak -4 dla x = 32** - łatwo zapomnieć, że funkcja może zwracać liczby ujemne (samo licz(2) = 0, licz(4) = -1).\n- **Pomylenie x mod 2 z x div 2** - pierwsze daje ostatni bit (0/1), drugie usuwa ostatni bit.\n- **Niewłaściwy warunek bazowy** - `if x = 1` (nie x = 0!) zwraca 1.\n\n## Złożoność obliczeniowa\n\n- **Czas: O(log x)** - głębokość rekurencji to liczba bitów x.\n- **Pamięć: O(log x)** - stos rekurencji.","image":"img/informatyka-2017-maj-matura-rozszerzona/zad-2.1.webp","solution_image":null,"topics":null,"page_from":4,"source":"ocr","answer_source":null,"answer_text_source":"ocr","solution_source":"maturazai","text_source":"ocr","source_label":"Informatyka · Matura · maj 2017 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Zadanie 2.1. (0-2)<br>Uzupełnij tabelę - podaj wartość licz(x) dla podanych argumentów x.<br>x<br>licz(x)<br>11<br>2<br>13<br>21<br>32<br>Miejsce na obliczenia<br>MIN_1R</p>","answer_text_html":"<p>Zadanie 2.1. (0-2)<br>III. Rozwiązywanie problemów<br>i podejmowanie decyzji […],<br>z zastosowaniem podejścia algorytmicznego.</p>\n<ol><li>posługuje się podstawowymi technikami</li></ol>\n<p>algorytmicznymi;</p>\n<ol><li>stosuje rekurencję w prostych sytuacjach</li></ol>\n<p>problemowych</p>\n<ol><li>opisuje własności algorytmów na</li></ol>\n<p>podstawie ich analizy;</p>\n<ol><li>ocenia zgodność algorytmu ze</li></ol>\n<p>specyfikacją problemu;<br>Schemat punktowania<br>2 p. - za podanie trzech poprawnych wartości.<br>1 p. - za podanie dwóch poprawnych wartości.<br>0 p. - za podanie jednej poprawnej wartości albo za brak odpowiedzi.<br>Poprawna odpowiedź:<br>x<br>licz(x)<br>13<br>2<br>21<br>1<br>32<br>-4</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p>| x | licz(x) |<br>| 11 | 2 |<br>| 13 | <strong>2</strong> |<br>| 21 | <strong>1</strong> |<br>| 32 | <strong>-4</strong> |</p>\n<h4>Sposób 1 - kluczowa obserwacja</h4>\n<p>Funkcja <code>licz(x)</code> to <strong>suma cyfr binarnych z modyfikowaną wagą</strong>: każda jedynka w zapisie binarnym x daje +1, każde zero daje -1, a najstarszy bit (zawsze 1) startuje od wartości 1. Krótko: <strong>licz(x) = (liczba jedynek w bin(x)) - (liczba zer w bin(x), pomijając wiodące zera) + </strong> Lepiej: rozwińmy rekurencję.</p>\n<p>Dla x = 1: zwraca 1.<br>Dla x &gt; 1: w := licz(x div 2); jeśli x mod 2 = 1 (czyli ostatni bit jest 1) → zwróć w+1; w przeciwnym razie (ostatni bit 0) → zwróć w-1.</p>\n<p>Więc każda cyfra binarna x (czytana od najmłodszej, ale pomijając najstarszą - ta startuje wartością 1):</p>\n<ul><li>bit 1 → dodaje +1</li><li>bit 0 → odejmuje 1</li></ul>\n<p><strong>Wzór:</strong> licz(x) = 1 + (liczba_jedynek_w_bin(x) - 1) - (liczba_zer_w_bin(x)) = liczba_jedynek - liczba_zer.</p>\n<p>Uwaga: najstarszy bit (zawsze 1 dla x &gt; 0) liczy się raz, ale w sumie wszystkie jedynki dają +1 każda, zera dają -1 każda. Plus startowa wartość 1 z licz(1) Sprawdźmy.</p>\n<h4>Sposób 2 - symulacja krok po kroku</h4>\n<h5>x = 11 (kontrola)</h5>\n<p>11 w binarnym: <strong>1011</strong></p>\n<ul><li>licz(11): 11 mod 2 = 1 → w = licz(5), wynik = w + 1</li><li>licz(5): 5 mod 2 = 1 → w = licz(2), wynik = w + 1</li><li>licz(2): 2 mod 2 = 0 → w = licz(1), wynik = w - 1</li><li>licz(1) = 1</li><li>licz(2) = 1 - 1 = 0</li><li>licz(5) = 0 + 1 = 1</li><li>licz(11) = 1 + 1 = <strong>2</strong> ✓</li></ul>\n<h5>x = 13</h5>\n<p>13 w binarnym: <strong>1101</strong></p>\n<ul><li>licz(13): 13 mod 2 = 1 → w = licz(6), wynik = w + 1</li><li>licz(6): 6 mod 2 = 0 → w = licz(3), wynik = w - 1</li><li>licz(3): 3 mod 2 = 1 → w = licz(1), wynik = w + 1</li><li>licz(1) = 1</li><li>licz(3) = 1 + 1 = 2</li><li>licz(6) = 2 - 1 = 1</li><li>licz(13) = 1 + 1 = <strong>2</strong> ✓</li></ul>\n<h5>x = 21</h5>\n<p>21 w binarnym: <strong>10101</strong></p>\n<ul><li>licz(21): 21 mod 2 = 1 → w = licz(10), wynik = w + 1</li><li>licz(10): 10 mod 2 = 0 → w = licz(5), wynik = w - 1</li><li>licz(5): 5 mod 2 = 1 → w = licz(2), wynik = w + 1</li><li>licz(2): 2 mod 2 = 0 → w = licz(1), wynik = w - 1</li><li>licz(1) = 1</li><li>licz(2) = 1 - 1 = 0</li><li>licz(5) = 0 + 1 = 1</li><li>licz(10) = 1 - 1 = 0</li><li>licz(21) = 0 + 1 = <strong>1</strong> ✓</li></ul>\n<h5>x = 32</h5>\n<p>32 w binarnym: <strong>100000</strong></p>\n<ul><li>licz(32): 32 mod 2 = 0 → w = licz(16), wynik = w - 1</li><li>licz(16): 16 mod 2 = 0 → w = licz(8), wynik = w - 1</li><li>licz(8): 8 mod 2 = 0 → w = licz(4), wynik = w - 1</li><li>licz(4): 4 mod 2 = 0 → w = licz(2), wynik = w - 1</li><li>licz(2): 2 mod 2 = 0 → w = licz(1), wynik = w - 1</li><li>licz(1) = 1</li><li>licz(2) = 1 - 1 = 0</li><li>licz(4) = 0 - 1 = -1</li><li>licz(8) = -1 - 1 = -2</li><li>licz(16) = -2 - 1 = -3</li><li>licz(32) = -3 - 1 = <strong>-4</strong> ✓</li></ul>\n<h4>Sposób 3 - wzór ogólny</h4>\n<p>Dla x w zapisie binarnym mającym <code>j</code> jedynek i <code>z</code> zer:<br><strong>licz(x) = j - z</strong></p>\n<p>Weryfikacja:</p>\n<ul><li>11 = 1011: j=3, z=1 → 3-1 = 2 ✓</li><li>13 = 1101: j=3, z=1 → 3-1 = 2 ✓</li><li>21 = 10101: j=3, z=2 → 3-2 = 1 ✓</li><li>32 = 100000: j=1, z=5 → 1-5 = <strong>-4</strong> ✓</li></ul>\n<p><strong>Implementacja Python (weryfikacja):</strong><br>```python<br>def licz(x):<br>if x == 1:<br>return 1<br>w = licz(x // 2)<br>if x % 2 == 1:<br>return w + 1<br>else:<br>return w - 1</p>\n<p>for x in [11, 13, 21, 32]:<br>print(x, licz(x)) # 11 2, 13 2, 21 1, 32 -4</p>\n<h4>Reference algorytmiczny - rekurencja binarna</h4>\n<blockquote>Reference - rekurencja po cyfrach binarnych:<br>- Wzorzec: <code>f(x) = f(x div 2) ± coś</code> rozwija cyfry binarne x.<br>- Głębokość rekurencji = liczba bitów x = ⌊log₂ x⌋ + 1.<br>- Funkcja licz: zlicza różnicę między liczbą jedynek a zer w bin(x).</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 2.1, max 2 pkt):<br>- <strong>2 pkt</strong> - za 3 poprawne wartości (z 3 wymaganych: 13, 21, 32)<br>- <strong>1 pkt</strong> - za 2 poprawne<br>- <strong>0 pkt</strong> - za 1 poprawną albo brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Znak -4 dla x = 32</strong> - łatwo zapomnieć, że funkcja może zwracać liczby ujemne (samo licz(2) = 0, licz(4) = -1).</li><li><strong>Pomylenie x mod 2 z x div 2</strong> - pierwsze daje ostatni bit (0/1), drugie usuwa ostatni bit.</li><li><strong>Niewłaściwy warunek bazowy</strong> - <code>if x = 1</code> (nie x = 0!) zwraca 1.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li><strong>Czas: O(log x)</strong> - głębokość rekurencji to liczba bitów x.</li><li><strong>Pamięć: O(log x)</strong> - stos rekurencji.</li></ul>"}]}