# Informatyka — zadanie 4.2

> Źródło: matura.lol — https://matura.lol/question/maturazai-informatyka-inf-2015-05/zad/4.2
> Wersja Markdown strony zadania (dla asystentów AI). Przy cytowaniu podaj matura.lol i link powyżej.

- arkusz: Informatyka · Matura · maj 2015 (rozszerzona)
- rok: 2015
- poziom: rozszerzona
- typ: open
- punkty: 3
- działy: Programowanie i algorytmika

## Treść

Zadanie 4.2. (0-3)
Podaj, ile liczb w pliku liczby.txt jest podzielnych przez 2 oraz ile liczb jest podzielnych
przez 8.
Przykład: Dla zestawu liczb:
101011010011001100000 (*), (**)
10001001
100100 (*)
101010010101011011000 (*), (**)
100011
trzy liczby są podzielne przez 2 (*) i dwie liczby są podzielne przez 8 (**).
MIN_2R

## Rozwiązanie — maturazai.pl (AI)

## Poprawna odpowiedź

- **podzielne przez 2: 500**
- **podzielne przez 8: 123**

## Sposób 1 - sprawdzanie końcówki zapisu binarnego

**Kluczowa obserwacja:**
- Liczba binarna jest **podzielna przez 2** ⟺ kończy się na **0** (ostatni bit = 0).
- Liczba binarna jest **podzielna przez 4** ⟺ kończy się na **00**.
- Liczba binarna jest **podzielna przez 8** ⟺ kończy się na **000** (3 ostatnie bity = 0).
- Ogólnie: podzielna przez 2^k ⟺ kończy się k zerami.

**Python:**
```python
licznik_2 = 0
licznik_8 = 0
with open('liczby.txt') as f:
for linia in f:
s = linia.strip()
if s.endswith('0'):
licznik_2 += 1
if s.endswith('000'):
licznik_8 += 1
print('podzielne przez 2:', licznik_2) # 500
print('podzielne przez 8:', licznik_8) # 123

## Sposób 2 - implementacja w C++ i Pascal

**C++:**
```cpp
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
ifstream plik("liczby.txt");
string s;
int p2 = 0, p8 = 0;
while (plik >> s) {
int n = s.length();
if (s[n-1] == '0') p2++;
if (n >= 3 && s.substr(n-3) == "000") p8++;
}
cout << "przez 2: " << p2 << endl; // 500
cout << "przez 8: " << p8 << endl; // 123
return 0;
}

**Pascal:**
```pascal
program Podzielnosc;
var
f: TextFile;
s: String;
n, p2, p8: Integer;
begin
AssignFile(f, 'liczby.txt');
Reset(f);
p2 := 0; p8 := 0;
while not Eof(f) do
begin
Readln(f, s);
n := Length(s);
if (n >= 1) and (s[n] = '0') then Inc(p2);
if (n >= 3) and (s[n] = '0') and (s[n-1] = '0') and (s[n-2] = '0') then Inc(p8);
end;
CloseFile(f);
Writeln('przez 2: ', p2);
Writeln('przez 8: ', p8);
end.

## Reference informatyczny - podzielność w systemie binarnym

> Reference - Bity i podzielność:
> - Bit najmniej znaczący (LSB) decyduje o parzystości: 0 = parzysta, 1 = nieparzysta.
> - **Podzielność przez 2^k** ⟺ k najmłodszych bitów = 0.
> - **Podzielność przez 3** w binarnym: brak prostej reguły, trzeba modulo arytmetyką.
> - **Mod 2^k**: w arytmetyce komputerowej `n & ((1<<k)-1)` to n mod 2^k (operacja AND).
> - W tym zadaniu działamy na **string** (liczby za duże dla int), więc sprawdzamy ostatnie znaki.

## Schemat oceniania CKE

> Klucz CKE (zadanie 4.2, max 3 pkt):
> - **3 pkt** - poprawne obie liczby (przez 2: 500, przez 8: 123)
> - **2 pkt** - poprawna tylko liczba podzielnych przez 8 ALBO tylko 250 wierszy (wynik: 121/27)
> - **1 pkt** - poprawna tylko liczba podzielnych przez 2
> - **0 pkt** - niepełna lub błędna albo brak

## Typowe pułapki

- **Podzielność przez 8 = trzy ostatnie zera**, nie tylko ostatnia cyfra (= podzielne przez 2).
- **Off-by-one w indeksowaniu Pascal**: `s[Length(s)]` to ostatni znak (od 1!), w C++ `s[n-1]` (od 0).
- **Plik z liczbami < 3 bity** - może spowodować błąd, sprawdź `n >= 3` przed `s[n-3]`.
- Łatwo pomylić: "podzielna przez 8" ⟹ "podzielna przez 2" (relacja zawierania) - tutaj liczymy DZIELONE PRZEZ 2 (500) i ODDZIELNIE przez 8 (123).
- Whitespace na końcu - `s.strip()` usuwa `\n`, `\r`, spacje. Bez tego ostatni znak to `\n`.
- **Trick połowy**: liczba podzielnych przez 2 = 500 to dokładnie połowa, więc dystrybucja końcówek bitów jest jednorodna.

## Złożoność obliczeniowa

- Sprawdzenie końcówki: O(1) (stała liczba znaków).
- Przetworzenie pliku: O(N · L), gdzie N = 1000, L = 250. Praktycznie O(N) = O(1000).
- Pamięć: O(L).

## Linki

- [dane JSON](https://matura.lol/api/question/maturazai-informatyka-inf-2015-05/zad/4.2)
- [otwórz w wyszukiwarce](https://matura.lol/?problem=maturazai-informatyka-inf-2015-05%2Fzad%2F4.2)

## Podobne zadania

- [Zadanie 3](https://matura.lol/question/informatyka-2026-maj-matura-rozszerzona/zad/3) — Zadanie 3. Pary slow W pliku tekstowym pary.txt znajduje sie 500 par slow zlozonych z liter alfabetu angielskiego a, b, , z. Kazda para slow jest zapisana w oso
- [Zadanie 2](https://matura.lol/question/informatyka-2026-maj-matura-rozszerzona/zad/2) — Zadanie 2. Dodawanie Rozwazamy dodawanie pisemne dwoch liczb zapisanych w systemie dziesietnym, zilustrowane na przykladzie. Przeniesienie: 1 1 1 1 Liczba a: 2 
- [Zadanie 4.2](https://matura.lol/question/informatyka-2020-lipiec-matura-rozszerzona-2/zad/4.2) — Zadanie 4.2. (0-4) Podaj wszystkie te identyfikatory dokumentów z pliku identyfikator.txt, których seria lub numer są palindromami, czyli czytane od lewej do pr
- [Zadanie 4.2](https://matura.lol/question/informatyka-2018-maj-matura-rozszerzona-2/zad/4.2) — Kontekst - patrz zadanie 4.1. Znajdź słowo, w którym występuje największa liczba **różnych** liter. Wypisz to słowo i liczbę występujących w nim różnych liter. 

_Ostatnia aktualizacja danych: 2026-10-03_
