Matura 2015. Zadanie 4. Liczby binarne.

W pliku liczby.txt znajduje się 1000 liczb naturalnych zapisanych binarnie. Każda liczba zapisana jest w osobnym wierszu. Pierwsze pięć wierszy zawiera następujące liczby:
11010100111
11110111111011101
1010100111010100
1101111111111111111111010100101010101001
1010110011001101010011110101010101010111
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, np. w języku C++ w zmiennej typu int.
Napisz program, który da odpowiedzi do poniższych zadań. Odpowiedzi zapisz w pliku wynik4.txt, a każdą odpowiedź poprzedź numerem oznaczającym odpowiednie zadanie.

Zadanie 4.1.
Podaj, ile liczb z pliku liczby.txt ma w swoim zapisie binarnym więcej zer niż jedynek.

Przykład: Dla zestawu liczb:
101011010011001100111
10001001
1000000
101010011100
100010
wynikiem jest liczba 3 (3 podkreślone liczby mają w swoim zapisie więcej zer niż jedynek).

Rozwiązanie:

Sprawdzenie należy rozpocząć od policzenia dla każdej liczby binarnej ilość zer i jedynek. Porównamy ze sobą otrzymane wyniki.

#include <iostream>
#include <fstream>
#include <math.h>
#define N 1000
using namespace std;
int main()
{
  string t[N];
  fstream plik;
  plik.open("liczby.txt");
  if (plik.good()==false)
    cout << "Problem z plikiem!" << endl;
  else
    for(int i=0; i<N; i++)
      plik >> t[i];
  // zadanie 1
  int il_liczb=0;
  short il_zer, il_jedynek;
  for (int i=0; i<N; i++) {
    il_zer=0;
    il_jedynek=0;
    for (int j=0; j<t[i].length(); j++) {
      if (t[i][j] == '0') il_zer++;
      else il_jedynek++;
    }
    if (il_zer>il_jedynek) il_liczb++;
  }
  cout << il_liczb << endl;
  return 0;
}

Zadanie 4.2.
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 (**).

Rozwiązanie:
Do rozwiązania tego zadania należy przeanalizować liczby binarne. Wiemy, kiedy na ostatnim miejscy liczby binarnej jest zero, to podana liczba jest  parzystą. Dlatego sprawdzamy ostatnią liczbę.

Kod źródłowy do tej części zadania:

#include <iostream>
#include <fstream>
#include <math.h>
#define N 1000
using namespace std;
int main()
{
  string t[N];
  fstream plik;
  plik.open("liczby.txt");
  if (plik.good()==false)
    cout << "Problem z plikiem!" << endl;
  else 
    for(int i=0; i<N; i++)
      plik >> t[i];
  int ile_parz=0;
  for (int i=0; i<N; i++)
    if (t[i][t[i].length()-1] == '0')
      ile_parz++;
  cout << ile_parz << endl;
  return 0;
}

 

 

Cyfra setek Cyfra dziesiątek Cyfra jedności
0, 2, 4, 6 lub 8 0, 4 lub 8 0 lub 8
1, 5 lub 9 6
2, 6 4
3, 7 2
1, 3, 5, 7 lub 9 0, 4 lub 8 4
1, 5 lub 9 2
2, 6 0 lub 8
3, 7 6

 Liczba jest podzielna przez 88, gdy liczba składająca się z trzech ostatnich cyfr dzieli się na 8.

Zadanie 4.3. (0–6)
Znajdź najmniejszą i największą liczbę w pliku liczby.txt. Jako odpowiedź podaj
numery wierszy, w których się one znajdują.
Przykład: Dla zestawu liczb:
101011010011001100111
10001001011101010
1001000
101010011100
1000110
najmniejsza liczba to: 1000110
największa liczba to: 101011010011001100111
Prawidłowa odpowiedź dla powyższego przykładu to: 5, 1.