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); } }