Autor rozwiązania: Maciej Muras

Plik do zadania: liczby

Treść zadania dostępna pod adresem: https://cke.gov.pl/images/_EGZAMIN_MATURALNY_OD_2015/Arkusze_egzaminacyjne/2015/formula_od_2015/MIN-R2_1P-152.pdf

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.

Rozwiązanie:

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).

Zadanie 4.1 pomijam z uwagi na fakt iż treść zadania jest niemal identyczna co w rozwiązanym już zadaniu  Słowa binarne (4.1 ten sam rok, „stara matura”) dostępnym pod adresem http://www.maciejmuras.com/?p=382

package com.company;
import java.io.*;
import java.util.*;
import java.math.BigInteger;
public class Main {
    public static void main(String[] args) throws FileNotFoundException{
        String liczbaBinarna;
        int podzielnePrzez8=0, podzielnePrzez2=0, numerWierszamin=0, numerWierszamax=0,aktualnyNumerWiersza=0;
        BigInteger max =new BigInteger("0");
        BigInteger min =new BigInteger("11010100111"); //pierwsza liczba z pliku - ręcznie wstawiona
        BigInteger liczbaBinarnaBigInteger = new BigInteger("0");
        Scanner odczyt = new Scanner (new File("liczby.txt"));
        while (odczyt.hasNextLine()) {
            aktualnyNumerWiersza++;
            liczbaBinarna = odczyt.nextLine();
// ----------------------------------------- zadanie 4.2 -----------------------------------------
            if (liczbaBinarna.endsWith("0")) podzielnePrzez2++;
// metoda endsWith() pozwala na porównanie ostatnich liter w zmiennej typu String z wzorcem
            //liczba podzielna przez 2 zapisana w systemie binarnym zawsze kończy się 0
            if (liczbaBinarna.endsWith("000")) podzielnePrzez8++;
            //liczba podzielna przez 8 zapisana w systemie binarnym zawsze kończy się 000
// ----------------------------------------- zadanie 4.3 -----------------------------------------
// Zadanie można rozwiązać w bardzo szybki sposób stosując klasę BigInteger.
            liczbaBinarnaBigInteger=new BigInteger(liczbaBinarna);
//liczbę BigInteger tworzymy przesyłając do konstruktora zmienną typu String zawierającą cyfry
            if ((liczbaBinarnaBigInteger.compareTo(max))== 1) {
// liczbaBinarnaBigInteger.compareTo(max) jeśli zostanie zwrócona liczba 1 oznacza to że pierwsza liczba jest większa
                max=liczbaBinarnaBigInteger;
                numerWierszamax=aktualnyNumerWiersza;
            }
            if (liczbaBinarnaBigInteger.compareTo(min)==-1 ) {
// liczbaBinarnaBigInteger.compareTo(min) jeśli zostanie zwrócona liczba -1 oznacza to że druga liczba jest większa
                min=liczbaBinarnaBigInteger;
                numerWierszamin=aktualnyNumerWiersza;
            }
        }
        System.out.println("Zadanie 4.2: Liczby podzielne " +
                "przez 8:"+podzielnePrzez8+"\nLiczby podzielne przez 2:"+podzielnePrzez2);
        System.out.println("Zadanie 4.3: Najmniejsza liczba jest w wierszu: " +numerWierszamin+"\n Największa liczba" +
                " jest w wierszu: " +numerWierszamax);
    }
}