Przejdź do treści

C++ - rozwiązania

Wczytanie danych

Zacznijmy od wczytania danych z pliku. Liczby są zapisane osobno w każdej linii, więc ich wczytanie jest proste. Wczytane liczby binarne w postaci tekstowej zapiszemy w liście nazwanej binaryNumbersTab.

#include <iostream>
#include <fstream>

using namespace std;

void readData(string binaryNumbersTab[]) {
    ifstream dataFile("liczby.txt");

    for (int i = 0; i < 1000; i++) {
        dataFile >> binaryNumbersTab[i];
    }

    dataFile.close();
}

int main() {
    string binaryNumbersTab[1000];

    readData(binaryNumbersTab);

    return 0;
}

Zadanie 1

Aby sprawdzić, czy liczba binarna jest parzysta, wystarczy spojrzeć na jej ostatnią (najmniej znaczącą) cyfrę.

int countEven(string binaryNumbersTab[]) {
    int count = 0;  // Licznik liczb parzystych
    for (int i = 0; i < 1000; i++) {
        string binary = binaryNumbersTab[i];
        if (binary[binary.size() - 1] == '0') {  // Jeżeli ostatni znak liczby binarnej to 0
            count++;  // zwiększamy licznik liczb parzystych
        }
    }

    return count;
}

Zadanie 2

Aby sprawdzić, czy liczba binarna jest podzielna przez \(4\) wystarczy sprawdzić jej dwie ostatnie (najmniej znaczące) cyfry. Jeżeli są równe \(0\), to liczba jest podzielna przez \(4\).

int countDivisibleBy4(string binaryNumbersTab[]) {
    int count = 0;
    for (int i = 0; i < 1000; i++) {
        string binary = binaryNumbersTab[i];
        if (binary[binary.size() - 1] == '0' && binary[binary.size() - 2] == '0') {
            count++;
        }
    }

    return count;
}

Zadanie 3

Zamieniamy liczbę binarną na system dziesiętny i sprawdzamy podzielność przez 10 za pomocą operatora modulo (reszty z dzielenia).

int binaryToDecimal(string binary) {  // Funkcja konwertująca liczbę binarną reprezentowaną jako tekst na liczbę naturalną w systemie dziesiętnym
    int decimal = 0;  // Wartość w systemie 10
    int power = 1;  // Potęga 2
    // Idziemy pętlą od końca
    for (int i = binary.size() - 1; i >= 0; i--) {
        decimal += (binary[i] - '0') * power;  // Przemnażamy cyfrę przez potęgę dwójki
        power *= 2;  // Zwiększamy potęgę dwójki
    }

    return decimal;
}

int countDivisibleBy10(string binaryNumbersTab[]) {
    int count = 0;
    for (int i = 0; i < 1000; i++) {
        string binary = binaryNumbersTab[i];
        int decimal = binaryToDecimal(binary)
        if (decimal % 10 == 0) {
            count++;
        }
    }

    return count;
}

Zadanie 4

Liczba binarna jest potęgą dwójki, jeżeli w jej zapisie występuje dokładnie jedna jedynka.

#include <map>

int countPowerOf2(string binaryNumbersTab[]) {
    int count = 0;
    for (int i = 0; i < 1000; i++) {
        string binary = binaryNumbersTab[i];
        map<char, int> digitCounter;  // Słownik do zliczania cyfr 0 i 1
        digitCounter['0'] = 0;  // Inicjalizujemy liczniki zer i jedynek
        digitCounter['1'] = 0;
        for (int pos = 0; pos < binary.size(); pos++) {  // Dla każdej cyfry w zapisie liczby binarnej
            char digit = binary[pos];
            digitCounter[digit]++;  // Zwiększamy licznik dla danej cyfry
        }

        if (digitCounter['1'] == 1) {
            count++;
        }
    }

    return count;
}

Zadanie 5

#include <map>

int countMoreZeroes(string binaryNumbersTab[]) {
    int count = 0;
    for (int i = 0; i < 1000; i++) {
        string binary = binaryNumbersTab[i];
        map<char, int> digitCounter;  // Słownik do zliczania cyfr 0 i 1
        digitCounter['0'] = 0;  // Inicjalizujemy liczniki zer i jedynek
        digitCounter['1'] = 0;
        for (int pos = 0; pos < binary.size(); pos++) {  // Dla każdej cyfry w zapisie liczby binarnej
            char digit = binary[pos];
            digitCounter[digit]++;  // Zwiększamy licznik dla danej cyfry
        }

        if (digitCounter['0'] > digitCounter['1']) {
            count++;
        }
    }

    return count;
}

Zadanie 6

#include <map>

int countMoreOnes(string binaryNumbersTab[]) {
    int count = 0;
    for (int i = 0; i < 1000; i++) {
        string binary = binaryNumbersTab[i];
        map<char, int> digitCounter;  // Słownik do zliczania cyfr 0 i 1
        digitCounter['0'] = 0;  // Inicjalizujemy liczniki zer i jedynek
        digitCounter['1'] = 0;
        for (int pos = 0; pos < binary.size(); pos++) {  // Dla każdej cyfry w zapisie liczby binarnej
            char digit = binary[pos];
            digitCounter[digit]++;  // Zwiększamy licznik dla danej cyfry
        }

        if (digitCounter['1'] > digitCounter['0']) {
            count++;
        }
    }

    return count;
}

Zadanie 7

#include <map>

int countEqualZeroesAndOnes(string binaryNumbersTab[]) {
    int count = 0;
    for (int i = 0; i < 1000; i++) {
        string binary = binaryNumbersTab[i];
        map<char, int> digitCounter;  // Słownik do zliczania cyfr 0 i 1
        digitCounter['0'] = 0;  // Inicjalizujemy liczniki zer i jedynek
        digitCounter['1'] = 0;
        for (int pos = 0; pos < binary.size(); pos++) {  // Dla każdej cyfry w zapisie liczby binarnej
            char digit = binary[pos];
            digitCounter[digit]++;  // Zwiększamy licznik dla danej cyfry
        }

        if (digitCounter['1'] == digitCounter['0']) {
            count++;
        }
    }

    return count;
}

Zadanie 8

int binaryToDecimal(string binary) {
    int decimal = 0;
    int power = 1;
    for (int i = binary.size() - 1; i >= 0; i--) {
        decimal += (binary[i] - '0') * power;
        power *= 2;
    }

    return decimal;
}

void findMinMax(string binaryNumbersTab[]) {
    int minDec = binaryToDecimal(binaryNumbersTab[0]);
    string minBin = binaryNumbersTab[0];
    int maxDec = minDec;
    string maxBin = binaryNumbersTab[0];
    for (int i = 1; i < 1000; i++) {
        string binary = binaryNumbersTab[i];
        decimal = binaryToDecimal(binary);

        if (decimal < minDec) {
            minDec = decimal;
            minBin = binary;
        }

        if (decimal > maxDec) {
            maxDec = decimal;
            maxBin = binary;
        }
    }

    cout << minBin << endl;
    cout << maxBin << endl;
}

Zadanie 9

#include <set>

int countUnique(string binaryNumbersTab[]) {
    set<string> binaryNumbersSet;
    for (int i = 0; i < 1000; i++) {
        string binary = binaryNumbersTab[i];
        binaryNumbersSet.insert(binary);
    }

    return binaryNumbersSet.size(); 
}

Zadanie 10

#include <map>

void count4Rest(string binaryNumbersTab[]) {
    map <string, int> dictCounter;
    // Tworzymy słownik liczników, który inicjalizujemy różnymi końcówkami liczb binarnych, które odpowiadają kolejnym resztom z dzielenia przez 4
    dictCounter["00"] = 0;
    dictCounter["01"] = 0;
    dictCounter["10"] = 0;
    dictCounter["11"] = 0;
    for (int i = 0; i < 1000; i++) {
        string binary = binaryNumbersTab[i];
        string lastTwo = "" + binary[binary.size() - 2] + binary[binary.size() - 1];  // Zwiększamy odpowiedni licznik
    }

    cout << restCounter["00"] << endl;
    cout << restCounter["01"] << endl;
    cout << restCounter["10"] << endl;
    cout << restCounter["11"] << endl;
}

Zadanie 11

int count1OnOdds(string binaryNumbersTab[]) {
    int count = 0;
    for (int i = 0; i < 1000; i++) {
        string binary = binaryNumbersTab[i];
        bool correct = true;
        for (int pos = 0; pos < binary.size(); pos++) {
            if ((pos + 1) % 2 == 0 && binary[pos] == '1') {  // Sprawdzamy, czy jedynka pojawiła się na parzystej pozycji
                correct = false;
                break;
            }
        }

        if (correct) {
            count++;
        }
    }

    return count;
}

Zadanie 12

int binaryToDecimal(string binary) {
    int decimal = 0;
    int power = 1;
    for (int i = binary.size() - 1; i >= 0; i--) {
        decimal += (binary[i] - '0') * power;
        power *= 2;
    }

    return decimal;
}

void findLongestGrowingSubstring(string binaryNumbersTab[]) {
    int maxLength = 1;  // Długość najdłuższego podciągu rosnącego
    int maxFirstIndex = 0;  // Indeks pierwszej wartości w najdłuższym podciągu rosnącym

    int currentLength = 1;  // Długość obecnie obliczanego ciągu
    int currentFirstIndex = 0;  // Indeks pierwszej wartości w obecnie obliczanym ciągu

    for (int i = 1; index < 1000; i++) {
        // Porównujemy obecną wartość z poprzednią
        if (binaryToDecimal(binaryNumbersTab[i]) > binaryToDecimal(binaryNumbersTab[i - 1])) {
            currentLength++;
        } else {
            currentLength = 1;
            currentFirstIndex = i;
        }

        if currentLength > maxLength {
            maxLength = currentLength;
            maxFirstIndex = currentFirstIndex;
        }
    }

    cout << "Długość: " << maxLength << endl;
    cout << "Indeks pierwszego el. :" << maxFirstIndex << endl;
    cout << "Indeks ostatniego el.: " << maxFirstIndex + maxLength - 1 << endl;
    maxLastIndex = maxFirstIndex + maxLength;
    for(int i = 0; i < 1000; i++) {
        cout << binaryNumbersTab(maxFirstIndex + i);
    }

    cout << endl;
}