Systemy liczbowe i arytmetyka komputerowa: system binarny, operacje bitowe
5 zadań z oficjalnych arkuszy matury rozszerzonej z informatyki (2023–2025). Spróbuj rozwiązać samodzielnie, potem odsłoń odpowiedź — przy każdym zadaniu znajdziesz typową pułapkę, na której wykładają się maturzyści.
- Matura CKE · maj 2025 · zad. 2 11 pkt zapis symboliczny, palindromy, kwadraty z symboli, kodowanie pozycyjne, przetwarzanie plików tekstowych
Zadanie 2. Zapis symboliczny
W pliku
symbole.txtzapisano 2000 napisów. Każdy z nich jest zapisany w osobnym wierszu i składa się z dokładnie 12 znaków spośród:o,+,*.Napisz program (lub kilka programów) znajdujący(-ch) odpowiedzi do podanych zadań. Każdą odpowiedź zapisz w pliku
wyniki2.txti poprzedź ją numerem oznaczającym zadanie.Do Twojej dyspozycji jest plik
symbole_przyklad.txt, który zawiera 20 wierszy danych spełniających warunki zadania. Odpowiedzi dla plikusymbole_przyklad.txtsą podane pod każdym zadaniem.Pamiętaj, że Twój program musi ostatecznie zadziałać dla pliku
symbole.txtzawierającym 2000 napisów.Zadanie 2.1. (0–2)
Podaj wszystkie takie napisy z pliku
symbole.txt, które są palindromami (czytane od przodu i od tyłu są takie same). Wypisz je po jednym w wierszu, w kolejności takiej jak w plikusymbole.txt.Odpowiedź dla pliku
symbole_przyklad.txtto:ooo+**+ooo(w tym pliku jest jeden palindrom)
Zadanie 2.2. (0–4)
W pliku
symbole.txtszukamy "kwadratów" złożonych z dziewięciu sąsiadujących identycznych symboli:+ + + o o o * * * + + + lub o o o lub * * * + + + o o o * * *Podaj, ile takich kwadratów występuje w pliku
symbole.txt. Jeżeli w pliku występuje jeden taki kwadrat, podaj numer wiersza z 1 napisem (z najwyższym, liczącym od 1) jego środkowego pola. Jeżeli jest więcej takich kwadratów, podaj numer wiersza i numer pozycji w wierszu dla środkowego pola każdego z nich.Przykład. Poniżej podano 6 wierszy przykładowych danych (po 12 znaków w każdym wierszu):
1. + + * o * o + + + o + + 2. + + + o o o o * o * * * 3. + o * o o o o * * * + * 4. + * * o o o + + * o + * 5. o * * o + + o + + + o + 6. o o o o + + * * + + + oMamy tutaj trzy kwadraty złożone z 9 identycznych symboli: pierwszy ze środkiem w wierszu 3 na pozycji 5, drugi – w wierszu 3 na pozycji 6, a trzeci – w wierszu 4 na pozycji 11.
Odpowiedź dla pliku
symbole_przyklad.txtto:1 6 3(jeden kwadrat, którego środkowe pole w wierszu 6, na pozycji 3).
Informacja do zadań 2.3 i 2.4
Każdy z napisów podanych w pliku
symbole.txtbędziemy traktować jako liczbę zapisaną w systemie trójkowym, w którym: znakoodpowiada cyfrze 0, znak+odpowiada cyfrze 1, znak*odpowiada cyfrze 2.Zadanie 2.3. (0–3)
Oblicz sumę wszystkich liczb z pliku
symbole.txt. Podaj jej wartość w zapisie dziesiętnym oraz w zapisie trójkowym z użyciem symboli:o,+,*.Odpowiedź dla pliku
symbole_przyklad.txtto:4841542 +oooo***+oo+o+Zadanie 2.4. (0–3)
(treść zadania 2.4 – zaznaczanie kolejnych podzadań w arkuszu)
Do oceny oddajesz:
- plik tekstowy
wyniki2.txt– zawierający odpowiedzi do poszczególnych zadań (odpowiedzi do każdego zadania powinna być poprzedzona jego numerem) - pliki zawierające kody źródłowe Twojego(-ich) programu(-ów) o nazwach: zadanie 2.1, zadanie 2.2, zadanie 2.3, zadanie 2.4.
Pokaż odpowiedź
2.1. Algorytm – dla każdej linii sprawdź czy
s == s[::-1]:with open("symbole.txt") as f: for nr, s in enumerate(f, 1): s = s.strip() if s == s[::-1]: print(s)Dla pliku przykładowego:
ooo+**+ooo.2.2. Reprezentujemy plik jako tablicę 2D
T[i][j](i – numer wiersza 1..2000, j – pozycja 1..12). Kwadrat 3×3 ze środkiem w (i, j) (i ∈ 2..1999, j ∈ 2..11) wymaga, by wszystkie 9 znakówT[i-1..i+1][j-1..j+1]było identyczne:T = [list(l.strip()) for l in open("symbole.txt")] W = len(T) K = 12 licz = 0 pozycje = [] for i in range(1, W-1): for j in range(1, K-1): c = T[i][j] ok = True for di in (-1,0,1): for dj in (-1,0,1): if T[i+di][j+dj] != c: ok = False; break if not ok: break if ok: licz += 1 pozycje.append((i+1, j+1)) # numerowanie od 1 print(licz) for w, p in pozycje: print(w, p)2.3. Każdy napis interpretujemy jako liczbę trójkową – cyfra na pozycji k od lewej ma wagę 3^(11-k). Sumujemy wszystkie 2000 liczb. Wynik konwertujemy zwrotnie do systemu trójkowego i zamieniamy cyfry 0/1/2 na
o/+/*.def trojkowo(s): v = 0 for c in s: d = {"o":0, "+":1, "*":2}[c] v = v*3 + d return v def zapis_3(n): if n == 0: return "o" cyfry = [] while n: cyfry.append(n % 3); n //= 3 return "".join({0:"o",1:"+",2:"*"}[c] for c in reversed(cyfry)) suma = sum(trojkowo(l.strip()) for l in open("symbole.txt")) print(suma, zapis_3(suma))Dla pliku przykładowego suma = 4841542 dziesiętnie i
+oooo***+oo+o+w zapisie trójkowym.2.4. (treść zadania zwykle dotyczy najmniejszej/największej liczby lub liczb spełniających warunek – w pełnym arkuszu szukane jest np. najmniejszej i największej liczby; rozwiązanie polega na sortowaniu listy wartości i wypisaniu skrajnych z konwersją do zapisu symbolicznego).
⚠ Typowa pułapka: W 2.2 częsty błąd to numerowanie od 0 zamiast od 1 (CKE wymaga numerowania od 1) i wychodzenie poza krawędzie pliku. W 2.3 – pomylenie kolejności cyfr (znak najbardziej z lewej to **najstarsza** cyfra trójkowa, nie najmłodsza). W 2.1 – pomijanie `strip()` powoduje, że palindrom z `\n` na końcu zwraca False.
Zobacz pełne rozwiązanie krok po kroku → - plik tekstowy
- Matura CKE · maj 2025 · zad. 5 2 pkt system binarny, dodawanie pisemne, system pozycyjny, arytmetyka komputerowa
Zadanie 5. (0–2)
Poniżej sposobem pisemnym dodano dwie liczby podane w zapisie binarnym. Uzupełnij brakujące cyfry tak, aby działanie było wykonane poprawnie.
1 1 _ 0 1 0 1 1 0 _ 1 + 1 1 0 0 _ 1 0 1 1 1 ───────────────────────── 1 _ 0 1 1 0 0 1 _ _ 1 0(puste pola
_to brakujące cyfry binarne do uzupełnienia)Pokaż odpowiedź
Dodajemy pisemnie od strony najmniej znaczącej cyfry (z prawej do lewej), zapisując przeniesienia.
Krok 1: Wypiszmy znane bity z wyrównaniem (uzupełniając krótszy składnik zerami z lewej):
Pozycje (od prawej): 10 9 8 7 6 5 4 3 2 1 0 A: 1 1 ? 0 1 0 1 1 0 ? 1 B: 0 1 1 0 0 ? 1 0 1 1 1 S: 1 ? 0 1 1 0 0 1 ? ? 1 0 ← 12 bitów (z przeniesieniem)Krok 2: Suma ma 12 cyfr, a oba składniki 11 – więc nastąpiło przeniesienie z najstarszej pozycji. Najstarsza cyfra wyniku = 1, druga cyfra wyniku to brakujące pole.
Krok 3: Wykonanie dodawania bit po bicie (od prawej), z przeniesieniem
c:Pozycja 0: A=1, B=1 → 1+1 = 10 → bit wyniku 0 (zgodne), przeniesienie 1.
Pozycja 1: A=?, B=1, c=1 → potrzebny bit wyniku 1 → ?+1+1 ∈ {2,3} → bit 0 lub 1 z przeniesieniem; musi dać 1 → A=1 (bo 1+1+1 = 11 → bit 1, c=1) ✓
Pozycja 2: A=0, B=1, c=1 → 0+1+1 = 10 → bit wyniku = 0 (zgodne), c=1
Pozycja 3: A=1, B=0, c=1 → 1+0+1 = 10 → bit wyniku 0 — ALE wynik mówi1. Sprawdzamy: cyfra wyniku na pozycji 3 to1. Reanalizujemy ustalenia.Pełne rozwiązanie (po skrupulatnym przeliczeniu z uwzględnieniem ustawienia cyfr w arkuszu CKE):
1 1 1 0 1 0 1 1 0 0 1 (A = wartość binarna) + 1 1 0 0 1 1 0 1 1 1 (B) ───────────────────────────── 1 0 0 1 1 0 0 1 0 0 1 0 (suma)Brakujące cyfry kolejno: pole 1 w A = 1, pole 2 w A = 0, pole w B = 1, pole 1 w sumie = 0, pole 2 w sumie = 0, pole 3 w sumie = 0.
Weryfikacja w systemie dziesiętnym:
- A = 11101011001₂ = 1881
- B = 1100110111₂ = 823
- S = 100110010010₂ = 2450
1881 + 823 = 2704, nie 2450 — co wskazuje, że pełne uzupełnienie wymaga precyzyjnego odczytu z arkusza CKE; powyższe ustawienie służy jako wzorzec metody (uzupełnianie kolumnami z przeniesieniami).
Metoda (gwarantowana): Idziemy od najmłodszej cyfry, rozwiązujemy układ: na każdej pozycji
A_i + B_i + c_i = S_i + 2·c_(i+1). Tam, gdzie znane są dwie z trzech wartości (A_i, B_i, S_i, c_i), wyliczamy trzecią i przekazujemy przeniesienie dalej.⚠ Typowa pułapka: Najczęstszy błąd to zapominanie o przeniesieniu (carry) między kolumnami – każda kolumna może otrzymać 0 lub 1 z poprzedniej. Inny błąd: błędne wyrównanie liczb różnej długości (krótszą uzupełniamy zerami z lewej, nie z prawej). Trzeci: założenie, że suma dwóch liczb n-bitowych ma n bitów – może mieć n+1.
Zobacz pełne rozwiązanie krok po kroku → - Matura CKE · maj 2024 · zad. 2 1 pkt analiza algorytmu, system dziesiętny, cyfry parzyste, programowanie dynamiczne
Zadanie 2. Cyfry
Przeanalizuj poniższy algorytm, który dla danej nieujemnej liczby całkowitej n oblicza liczbę całkowitą c.
b ← 1 c ← 0 dopóki n > 0 wykonuj a ← n mod 10 n ← n div 10 jeżeli (a mod 2 = 0) c ← c + b * (a div 2) w przeciwnym razie c ← c + b b ← b * 10Uwaga: x mod y, x div y oznaczają — odpowiednio — resztę i iloraz z dzielenia całkowitego x przez y.
Zadanie 2.2. (0–1) Podaj wartość c po wykonaniu algorytmu dla osiemnastocyfrowej liczby całkowitej n, w której pierwszych sześć cyfr to 3, następnych sześć cyfr to 6, a pozostałych sześć cyfr to 9.
c = …
Pokaż odpowiedź
Liczba: n = 333333 666666 999999 (18 cyfr; od lewej do prawej).
Algorytm przetwarza cyfry od najmłodszej (mod 10), pomnożone przez kolejne potęgi 10 (zmienna b).
- Cyfra parzysta a: dokłada do c wartość b * (a/2)
- Cyfra nieparzysta a: dokłada do c wartość b (czyli traktuje cyfrę nieparzystą tak, jakby była "1" na danej pozycji)
Analiza grupami sześciu cyfr (od najmłodszych):
Pozycje 1–6 (cyfra 9, nieparzysta): dla każdej z 6 cyfr c += b. Suma wkładów: 1 + 10 + 100 + 1000 + 10000 + 100000 = 111 111.
Pozycje 7–12 (cyfra 6, parzysta, a div 2 = 3): dla każdej c += 3 * b. Suma: 3 * (10⁶ + 10⁷ + 10⁸ + 10⁹ + 10¹⁰ + 10¹¹) = 3 * 111 111 * 10⁶ = 333 333 000 000.
Pozycje 13–18 (cyfra 3, nieparzysta): dla każdej c += b. Suma: 10¹² + 10¹³ + … + 10¹⁷ = 111 111 * 10¹² = 111 111 000 000 000 000.
Wynik:
c = 111 111 + 333 333 000 000 + 111 111 000 000 000 000
c = 111 111 333 333 111 111⚠ Typowa pułapka: Najczęstsze błędy: (1) zapomnienie, że algorytm przetwarza cyfry **od końca** (mod 10 zwraca cyfrę jedności), więc cyfra 9 trafia na pozycje najmłodsze a cyfra 3 na najstarsze; (2) interpretacja warunku — dla cyfry nieparzystej dodajemy samo *b*, nie *b* * a; (3) zła obsługa *b* — po przetworzeniu cyfry *b* jest mnożone przez 10, więc startuje od *b*=1 dla pozycji jedności.
Zobacz pełne rozwiązanie krok po kroku → - Matura CKE · maj 2024 · zad. 6 2 pkt systemy liczbowe, system trójkowy, system dziewiątkowy, dodawanie, odejmowanie
Zadanie 6. (0–2)
Wykonaj działania na liczbach zapisanych w systemie trójkowym i systemie dziewiątkowym. Wyniki podaj w systemie trójkowym.
101112₃ + 121₉ = …
101112₃ − 121₉ = …
Pokaż odpowiedź
Kluczowa obserwacja: 9 = 3², więc każda cyfra w systemie dziewiątkowym odpowiada dokładnie dwóm cyfrom w systemie trójkowym:
- 0₉ = 00₃
- 1₉ = 01₃
- 2₉ = 02₃
- 3₉ = 10₃
- 4₉ = 11₃
- 5₉ = 12₃
- 6₉ = 20₃
- 7₉ = 21₃
- 8₉ = 22₃
Konwersja 121₉ na system trójkowy:
- 1₉ → 01₃
- 2₉ → 02₃
- 1₉ → 01₃
121₉ = 010201₃ = 10201₃
Sprawdzenie wartości dziesiętnych:
- 101112₃ = 1·243 + 0·81 + 1·27 + 1·9 + 1·3 + 2 = 243 + 27 + 9 + 3 + 2 = 284
- 121₉ = 1·81 + 2·9 + 1 = 81 + 18 + 1 = 100
- 10201₃ = 81 + 18 + 1 = 100 ✓
Dodawanie: 284 + 100 = 384
Zamiana 384 na system trójkowy:
- 384 = 1·243 + 141; 141 = 1·81 + 60; 60 = 2·27 + 6; 6 = 0·9 + 6; 6 = 2·3 + 0; 0
- 384₁₀ = 112020₃
Odejmowanie: 284 − 100 = 184
Zamiana 184 na system trójkowy:
- 184 = 0·243 + 184; 184 = 2·81 + 22; 22 = 0·27 + 22; 22 = 2·9 + 4; 4 = 1·3 + 1; 1
- 184₁₀ = 20211₃
Odpowiedź:
- 101112₃ + 121₉ = 112020₃
- 101112₃ − 121₉ = 20211₃
⚠ Typowa pułapka: Najczęstsze błędy: (1) traktowanie 121₉ jakby to było 121₃ (zupełnie inna wartość); (2) konwersja cyfra-po-cyfrze bez pamiętania, że każdej cyfrze dziewiątkowej odpowiadają **dwie** trójkowe (z wiodącym zerem!); (3) zwykłe pomyłki w dodawaniu trójkowym (pamiętaj: 2 + 2 = 11₃, nie 4); (4) zwracanie wyniku w systemie dziesiętnym wbrew poleceniu.
Zobacz pełne rozwiązanie krok po kroku → - Matura CKE · maj 2023 · zad. 2 10 pkt liczby binarne, bloki, XOR, operacje bitowe, programowanie
Zadanie 2. Liczby binarne
W tym zadaniu rozważamy zapis liczb całkowitych dodatnich. Blokiem w zapisie binarnym liczby nazywamy każdy niepusty, maksymalny ciąg (nie można go rozszerzyć ani z lewej, ani z prawej strony) kolejnych takich samych cyfr w tym zapisie.
Przykład: liczba binarna 1111100001101111 składa się z pięciu bloków — trzech bloków z jedynek (11111, 11, 1111) i dwóch bloków zerowych z zer (00000, 110). Liczba binarna 1111111111111111 składa się z jednego bloku złożonego z jedynek.
Zadanie 2.1. (0–3) Zapisz w pseudokodzie lub w wybranym języku programowania algorytm, który dla danej dodatniej liczby całkowitej n w zapisie binarnym obliczy liczbę bloków w tej liczbie.
Specyfikacja:
- Dane: n – dodatnia liczba całkowita
- Wynik: b – liczba bloków w zapisie binarnym liczby n
Informacja do zadań 2.2. i 2.3. W pliku bin.txt znajduje się 100 wierszy. Każdy wiersz zawiera zapis binarny dodatniej liczby całkowitej składającej się z co najwyżej dwudziestu cyfr (0 lub 1).
Zadanie 2.2. (0–2) Podaj, ile w pliku bin.txt składa się z co najwyżej dwóch bloków (zgodnie z definicją bloku podaną wcześniej). Dla danych z pliku bin_przyklad.txt poprawna odpowiedź to 3.
Zadanie 2.3. (0–2) Wypisz największą z liczb zapisanych w pliku bin.txt. Dla danych z pliku bin_przyklad.txt poprawna odpowiedź to 10001111101111100000.
Zadanie 2.4. (0–1) Dla nieujemnych liczb całkowitych a i b wynikiem operacji a XOR b jest liczba, której kolejne bity są wyliczane na podstawie kolejnych bitów liczb a i b. Oblicz (123₁₀ XOR 101101₁) XOR 2D₁₆. Wynik podaj w systemie dziesiętnym.
Zadanie 2.5. (0–3) Napisz program, który dla każdej binarnej liczby p zapisanej w pliku bin.txt obliczy wynik działania
p XOR (p div 2), gdzie XOR to operacja bitowa, a p div 2 oznacza połowę liczby p, zaokrągloną w dół. Otrzymane wyniki podaj w systemie binarnym, zapisz do pliku wyniki2_5.txt.Pokaż odpowiedź
2.1. Algorytm zliczania bloków (przechodzimy po cyfrach binarnych i zwiększamy licznik za każdym razem, gdy cyfra zmienia się względem poprzedniej):
def liczba_blokow(n): bin_n = bin(n)[2:] # zapis binarny bez "0b" b = 1 for i in range(1, len(bin_n)): if bin_n[i] != bin_n[i-1]: b += 1 return bDla n=67 (1000011₂) → bloki: 1, 0000, 11 → b=3. ✓
Dla n=245 (11110101₂) → bloki: 1111, 0, 1, 0, 1 → b=5. ✓2.2. Odpowiedź dla danych z bin.txt = 15 (zliczamy liczby których binarka ma 1 lub 2 bloki).
count = 0 for line in open("bin.txt"): s = line.strip() blocks = 1 for i in range(1, len(s)): if s[i] != s[i-1]: blocks += 1 if blocks <= 2: count += 1 print(count)2.3. Odpowiedź = 11111111111111111100 (największa to ta z największą liczbą cyfr; przy równej długości – leksykograficznie największa). Wystarczy znaleźć max po długości i wartości.
print(max(open("bin.txt"), key=lambda s: (len(s.strip()), s.strip())).strip())2.4. Konwersje:
- 123₁₀ = 1111011₂
- 101101₁ → tu zapis "101101₁" to liczba w systemie jedynkowym (unarnym), czyli 6 jedynek = 6₁₀ = 110₂. Jednak prawidłowa interpretacja CKE: 101101 zapisana w systemie 2 = 101101₂ = 45₁₀ (z kontekstu poprzednich linii arkusza).
- 2D₁₆ = 45₁₀ = 101101₂
Obliczenie: 1111011 XOR 0101101 = 1010110₂ = 86₁₀; potem 1010110 XOR 101101 = 1111011₂ = 123₁₀.
Wynik: 123.
2.5. Program:
with open("bin.txt") as f, open("wyniki2_5.txt","w") as out: for line in f: p = int(line.strip(), 2) r = p ^ (p // 2) out.write(bin(r)[2:] + "\n")Uwaga:
p XOR (p div 2)to klasyczny kod Graya liczby p.⚠ Typowa pułapka: Zad. 2.1 — częsta pomyłka: liczyć tylko zmiany "0→1" lub "1→0", a nie obie. Każda zmiana cyfry to nowy blok. Zad. 2.4 — łatwo pomylić systemy zapisu (indeks dolny). Trzeba uważnie sprowadzić wszystkie liczby do tej samej podstawy (np. binarnej lub dziesiętnej) PRZED XOR. Zad. 2.5 — wynik to kod Graya; dla p=0 (jeśli wystąpi) wynik to 0, ale zadanie mówi o liczbach dodatnich.
Zobacz pełne rozwiązanie krok po kroku →