Skip to content

Instantly share code, notes, and snippets.

@rafalw
Last active March 28, 2022 15:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rafalw/6b19fb7176958b40fe882cfd7f2b5256 to your computer and use it in GitHub Desktop.
Save rafalw/6b19fb7176958b40fe882cfd7f2b5256 to your computer and use it in GitHub Desktop.
Zadania maturalne (informatyka rozszerzona). Maj 2015, zadanie 4. C++11/C++17
Dane do zadania dostępne są pod adresem:
https://arkusze.pl/maturalne/informatyka-2015-maj-matura-rozszerzona-zalaczniki.zip
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <numeric> // -std=c++17
// W <numeric> jest m. in. NWD (GCD)
using namespace std;
vector<string> liczby;
void wczytaj_liczby(vector<string>& tablica) {
ifstream plik_we("liczby.txt");
string napis = "";
while(getline(plik_we, napis)) {
tablica.push_back(napis);
}
// Dobry nawyk:
plik_we.close();
}
int main() {
wczytaj_liczby(liczby);
int ile = 0;
for (string l : liczby) {
int zera = 0;
int jedynki = 0;
for (int i = 0; i < l.length(); i++) {
if (l[i] == 48) {
zera++;
} else {
jedynki++;
}
}
if (zera > jedynki) {
ile++;
}
}
cout << ile << endl;
return 0;
}
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <numeric> // -std=c++17
// W <numeric> jest m. in. NWD (GCD)
using namespace std;
vector<string> liczby;
void wczytaj_liczby(vector<string>& tablica) {
ifstream plik_we("liczby.txt");
string napis = "";
while(getline(plik_we, napis)) {
tablica.push_back(napis);
}
// Dobry nawyk:
plik_we.close();
}
int main() {
wczytaj_liczby(liczby);
int ile_2 = 0;
int ile_8 = 0;
for (string l : liczby) {
if (l[l.length() - 1] == 48) {
ile_2++;
}
if (l[l.length() - 1] == 48 && l[l.length() - 2] == 48 && l[l.length() - 3] == 48) {
ile_8++;
}
}
cout << "Podzielne przez 2: " << ile_2 << endl;
cout << "Podzielne przez 8: " << ile_8 << endl;
return 0;
}
// Rozwiązanie bardzo długie, ale skuteczne.
// Być może "zabawa" strukturami danych jest niepotrzebna, ale wprowadza porządek w kodzie.
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <numeric> // -std=c++17
// W <numeric> jest m. in. NWD (GCD)
using namespace std;
struct liczba_w_pliku {
string wartosc;
int numer_w;
};
vector<string> liczby;
vector<liczba_w_pliku> liczby_najwieksze;
vector<liczba_w_pliku> liczby_najmniejsze;
void wczytaj_liczby(vector<string>& tablica) {
ifstream plik_we("liczby.txt");
string napis = "";
while(getline(plik_we, napis)) {
tablica.push_back(napis);
}
// Dobry nawyk:
plik_we.close();
}
int znajdz_max_dl(vector<string>& tablica) {
int maks = tablica[0].length();
for (int i = 1; i < tablica.size(); i++) {
if (tablica[i].length() > maks) {
maks = tablica[i].length();
}
}
return maks;
}
int znajdz_min_dl(vector<string>& tablica) {
int min = tablica[0].length();
for (int i = 1; i < tablica.size(); i++) {
if (tablica[i].length() < min) {
min = tablica[i].length();
}
}
return min;
}
void znajdz_liczby_najwieksze(vector<string>& dane, int maks_dl) {
for (int i = 0; i < dane.size(); i++) {
if (dane[i].length() == maks_dl) {
liczby_najwieksze.push_back({ dane[i], i + 1});
}
}
}
void znajdz_liczby_najmniejsze(vector<string>& dane, int min_dl) {
for (int i = 0; i < dane.size(); i++) {
if (dane[i].length() == min_dl) {
liczby_najmniejsze.push_back({ dane[i], i + 1});
}
}
}
// Porównanie dwóch bardzo długich liczb binarnych o tej samej liczbie pozycji
int porownaj_bin(string& a, string& b) {
for (int i = 0; i < a.length(); i++) {
if (a[i] > b[i]) {
return 1;
} else if (a[i] < b[i]) {
return 2;
}
}
return 0;
}
int main() {
wczytaj_liczby(liczby);
znajdz_liczby_najwieksze(liczby, znajdz_max_dl(liczby));
znajdz_liczby_najmniejsze(liczby, znajdz_min_dl(liczby));
// Wiersz najmniejszej liczby binarnej
// – te liczby można konwertować na unsigned long, ponieważ są wystraczająco "krótkie"
// (3 znaki w zapisie binarnym)
// liczba_w_pliku najmn = liczby_najmniejsze[0];
// for (int i = 1; i < liczby_najmniejsze.size(); i++) {
// if (stoul(najmn.wartosc) > stoul(liczby_najmniejsze[i].wartosc)) {
// najmn = liczby_najmniejsze[i];
// }
// }
// – bardziej uniwersalna metoda (uwzględniająca możliwość, że najkrótsze liczby binarne
// nie nadają się do konwersji funkcją stoi/stoul itp.)
liczba_w_pliku najmn = liczby_najmniejsze[0];
for (int i = 1; i < liczby_najmniejsze.size(); i++) {
int rez = porownaj_bin(najmn.wartosc, liczby_najmniejsze[i].wartosc);
if (rez == 1) { // najmn > aktualna
najmn = liczby_najmniejsze[i];
}
}
// Wiersz największej liczby binarnej
liczba_w_pliku najw = liczby_najwieksze[0];
for (int i = 1; i < liczby_najwieksze.size(); i++) {
int rez = porownaj_bin(najw.wartosc, liczby_najwieksze[i].wartosc);
if (rez == 2) { // najw < aktualna
najw = liczby_najwieksze[i];
}
}
cout << "Numer wiersza najmniejszej liczby: " << najmn.numer_w << endl;
cout << "Numer wiersza największej liczby: " << najw.numer_w << endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment