{"id":"informatyka-2015-maj-matura-rozszerzona/zad/4.1","paper_id":"informatyka-2015-maj-matura-rozszerzona","number":"4.1","points":3,"ptype":"open","subject":"informatyka","category":"matura","year":2015,"month":"maj","level":"rozszerzona","text":"Zadanie 4. Liczby binarne\n\nW pliku liczby.txt znajduje się 1000 liczb naturalnych zapisanych binarnie. Każda liczba zapisana jest w osobnym wierszu. Każda liczba binarna zawiera co najwyżej 250 cyfr binarnych, co oznacza, że w wielu językach programowania wartości niektórych z tych liczb nie da się zapamiętać w pojedynczej zmiennej typu całkowitoliczbowego.\n\nPrzykład: Dla zestawu liczb 101011010011001100111, 10001001, 1000000, 101010011100, 100010 - wynikiem jest 3 (3 liczby mają w zapisie więcej zer niż jedynek).\n\nPodaj, ile liczb z pliku liczby.txt ma w swoim zapisie binarnym więcej zer niż jedynek.","answer":null,"answer_text":null,"solution":"## Poprawna odpowiedź\n\n**422** liczb z pliku liczby.txt ma więcej zer niż jedynek w zapisie binarnym.\n\n## Sposób 1 - przetwarzanie ciągu znaków (każda liczba to STRING, nie int)\n\nKluczowa obserwacja: liczby mają do 250 cyfr binarnych → nie mieszczą się w int64 (max ~63 bity). Dlatego traktujemy każdą liczbę jako **string** i zliczamy znaki.\n\n**Python:**\n```python\nlicznik = 0\nwith open('liczby.txt') as f:\nfor linia in f:\ns = linia.strip() # usuwa whitespace, \\n\nzera = s.count('0')\njedynki = s.count('1')\nif zera > jedynki:\nlicznik += 1\nprint(licznik) # 422\n\n## Sposób 2 - implementacja w C++ i Pascal\n\n**C++:**\n```cpp\n#include <iostream>\n#include <fstream>\n#include <string>\nusing namespace std;\n\nint main() {\nifstream plik(\"liczby.txt\");\nstring linia;\nint licznik = 0;\nwhile (plik >> linia) {\nint zera = 0, jedynki = 0;\nfor (char c : linia) {\nif (c == '0') zera++;\nelse if (c == '1') jedynki++;\n}\nif (zera > jedynki) licznik++;\n}\ncout << licznik << endl; // 422\nreturn 0;\n}\n\n**Pascal:**\n```pascal\nprogram LiczbyBinarne;\nvar\nf: TextFile;\ns: String;\ni, zera, jedynki, licznik: Integer;\nbegin\nAssignFile(f, 'liczby.txt');\nReset(f);\nlicznik := 0;\nwhile not Eof(f) do\nbegin\nReadln(f, s);\nzera := 0; jedynki := 0;\nfor i := 1 to Length(s) do\nif s[i] = '0' then Inc(zera)\nelse if s[i] = '1' then Inc(jedynki);\nif zera > jedynki then Inc(licznik);\nend;\nCloseFile(f);\nWriteln(licznik); // 422\nend.\n\n## Reference informatyczny - operacje na napisach\n\n> Reference - String processing:\n> - **Python**: `s.count('0')` - liczba wystąpień znaku '0'. O(n).\n> - **C++**: `std::count(s.begin(), s.end(), '0')` z `<algorithm>`. Lub pętla for.\n> - **Pascal**: pętla for i := 1 to Length(s).\n> - **Plik tekstowy**: czytanie linijka po linijce - `for line in f` (Python), `getline()` (C++), `Readln` (Pascal).\n> - Kluczowe: liczby binarne mogą być długie (250 cyfr = ~10^75) - NIE używaj typu int!\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 4.1, max 3 pkt):\n> - **3 pkt** - poprawna odpowiedź **422**\n> - **2 pkt** - uwzględnienie tylko 250 wierszy (wynik: 98) - częsty błąd Pascala przy odczycie ograniczonym\n> - **1 pkt** - nieuwzględnienie ostatniego znaku w wierszu (wynik: 419) - np. zatrzymanie pętli na n-1\n> - **0 pkt** - odpowiedź niepełna lub błędna albo brak\n\n## Typowe pułapki\n\n- **Konwersja na int**: `int('1010 250bitów', 2)` w Pythonie zadziała (Python ma arbitrary precision), ale w C++/Pascal `long long` to maksimum 63 bity - przepełnienie. Lepiej trzymać jako string.\n- **Pomylenie liczby zer z jedynkami** - sprawdź `zera > jedynki`, nie `zera >= jedynki`.\n- **Zliczanie ostatniego znaku** - w Pascal `Length(s)` zwraca długość włącznie z ostatnim znakiem.\n- **Pomylenie czytania**: w Pascal `Readln(f, s)` wczytuje całą linię razem z `\\n`. Sprawdź czy nie ma whitespace na końcu.\n- **Limit 250 wierszy zamiast 1000** - Pascal ma czasem domyślny limit linii w starych wersjach.\n\n## Złożoność obliczeniowa\n\n- Przetwarzanie pliku: O(N · L), gdzie N = 1000 (liczb), L = 250 (max długość). To O(250 000) = bardzo szybko.\n- Pamięć: O(L) (jedna linia w pamięci na raz).\n- **Całkowita: O(N · L)**.","image":null,"solution_image":null,"topics":null,"page_from":null,"source":"maturazai","answer_source":null,"answer_text_source":null,"solution_source":"maturazai","text_source":"maturazai","source_label":"Informatyka · Matura · maj 2015 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Zadanie 4. Liczby binarne</p>\n<p>W pliku liczby.txt znajduje się 1000 liczb naturalnych zapisanych binarnie. Każda liczba zapisana jest w osobnym wierszu. Każda liczba binarna zawiera co najwyżej 250 cyfr binarnych, co oznacza, że w wielu językach programowania wartości niektórych z tych liczb nie da się zapamiętać w pojedynczej zmiennej typu całkowitoliczbowego.</p>\n<p>Przykład: Dla zestawu liczb 101011010011001100111, 10001001, 1000000, 101010011100, 100010 - wynikiem jest 3 (3 liczby mają w zapisie więcej zer niż jedynek).</p>\n<p>Podaj, ile liczb z pliku liczby.txt ma w swoim zapisie binarnym więcej zer niż jedynek.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>422</strong> liczb z pliku liczby.txt ma więcej zer niż jedynek w zapisie binarnym.</p>\n<h4>Sposób 1 - przetwarzanie ciągu znaków (każda liczba to STRING, nie int)</h4>\n<p>Kluczowa obserwacja: liczby mają do 250 cyfr binarnych → nie mieszczą się w int64 (max ~63 bity). Dlatego traktujemy każdą liczbę jako <strong>string</strong> i zliczamy znaki.</p>\n<p><strong>Python:</strong><br>```python<br>licznik = 0<br>with open(&#x27;liczby.txt&#x27;) as f:<br>for linia in f:<br>s = linia.strip() # usuwa whitespace, \\n<br>zera = s.count(&#x27;0&#x27;)<br>jedynki = s.count(&#x27;1&#x27;)<br>if zera &gt; jedynki:<br>licznik += 1<br>print(licznik) # 422</p>\n<h4>Sposób 2 - implementacja w C++ i Pascal</h4>\n<p><strong>C++:</strong><br>```cpp<br>#include &lt;iostream&gt;<br>#include &lt;fstream&gt;<br>#include &lt;string&gt;<br>using namespace std;</p>\n<p>int main() {<br>ifstream plik(&quot;liczby.txt&quot;);<br>string linia;<br>int licznik = 0;<br>while (plik &gt;&gt; linia) {<br>int zera = 0, jedynki = 0;<br>for (char c : linia) {<br>if (c == &#x27;0&#x27;) zera++;<br>else if (c == &#x27;1&#x27;) jedynki++;<br>}<br>if (zera &gt; jedynki) licznik++;<br>}<br>cout &lt;&lt; licznik &lt;&lt; endl; // 422<br>return 0;<br>}</p>\n<p><strong>Pascal:</strong><br>```pascal<br>program LiczbyBinarne;<br>var<br>f: TextFile;<br>s: String;<br>i, zera, jedynki, licznik: Integer;<br>begin<br>AssignFile(f, &#x27;liczby.txt&#x27;);<br>Reset(f);<br>licznik := 0;<br>while not Eof(f) do<br>begin<br>Readln(f, s);<br>zera := 0; jedynki := 0;<br>for i := 1 to Length(s) do<br>if s[i] = &#x27;0&#x27; then Inc(zera)<br>else if s[i] = &#x27;1&#x27; then Inc(jedynki);<br>if zera &gt; jedynki then Inc(licznik);<br>end;<br>CloseFile(f);<br>Writeln(licznik); // 422<br>end.</p>\n<h4>Reference informatyczny - operacje na napisach</h4>\n<blockquote>Reference - String processing:<br>- <strong>Python</strong>: <code>s.count(&#x27;0&#x27;)</code> - liczba wystąpień znaku &#x27;0&#x27;. O(n).<br>- <strong>C++</strong>: <code>std::count(s.begin(), s.end(), &#x27;0&#x27;)</code> z <code>&lt;algorithm&gt;</code>. Lub pętla for.<br>- <strong>Pascal</strong>: pętla for i := 1 to Length(s).<br>- <strong>Plik tekstowy</strong>: czytanie linijka po linijce - <code>for line in f</code> (Python), <code>getline()</code> (C++), <code>Readln</code> (Pascal).<br>- Kluczowe: liczby binarne mogą być długie (250 cyfr = ~10^75) - NIE używaj typu int!</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 4.1, max 3 pkt):<br>- <strong>3 pkt</strong> - poprawna odpowiedź <strong>422</strong><br>- <strong>2 pkt</strong> - uwzględnienie tylko 250 wierszy (wynik: 98) - częsty błąd Pascala przy odczycie ograniczonym<br>- <strong>1 pkt</strong> - nieuwzględnienie ostatniego znaku w wierszu (wynik: 419) - np. zatrzymanie pętli na n-1<br>- <strong>0 pkt</strong> - odpowiedź niepełna lub błędna albo brak</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Konwersja na int</strong>: <code>int(&#x27;1010 250bitów&#x27;, 2)</code> w Pythonie zadziała (Python ma arbitrary precision), ale w C++/Pascal <code>long long</code> to maksimum 63 bity - przepełnienie. Lepiej trzymać jako string.</li><li><strong>Pomylenie liczby zer z jedynkami</strong> - sprawdź <code>zera &gt; jedynki</code>, nie <code>zera &gt;= jedynki</code>.</li><li><strong>Zliczanie ostatniego znaku</strong> - w Pascal <code>Length(s)</code> zwraca długość włącznie z ostatnim znakiem.</li><li><strong>Pomylenie czytania</strong>: w Pascal <code>Readln(f, s)</code> wczytuje całą linię razem z <code>\\n</code>. Sprawdź czy nie ma whitespace na końcu.</li><li><strong>Limit 250 wierszy zamiast 1000</strong> - Pascal ma czasem domyślny limit linii w starych wersjach.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Przetwarzanie pliku: O(N · L), gdzie N = 1000 (liczb), L = 250 (max długość). To O(250 000) = bardzo szybko.</li><li>Pamięć: O(L) (jedna linia w pamięci na raz).</li><li><strong>Całkowita: O(N · L)</strong>.</li></ul>"}]}