Matura 2017 (maj). Zadanie 4. Trójki liczb
W pliku liczby.txt znajduje się 1000 trójek liczb całkowitych dodatnich rozdzielonych pojedynczymi odstępami, każda trójka – w osobnym wierszu. Liczby zapisane w pliku należą do przedziału [1, 32 767].
Fragment danych z pliku liczby.txt:
20634 31423 261
11009 21970 32126
26318 16336 5158
24196 14586 3545
Napisz program(y), który(e) da(dzą) odpowiedzi do poniższych zadań. Odpowiedzi zapisz
w pliku wyniki4.txt, a każdą odpowiedź poprzedź odpowiednim numerem zadania.
Zadanie 1.
Podaj, w ilu wierszach pliku z danymi liczby w trójkach są uporządkowane rosnąco.
Przykład:
Dla danych
4587 9351 28950
15010 28342 31848
30172 7492 6768
29120 21664 32328
odpowiedzią jest 2 (w dwóch wyróżnionych wierszach liczby są uporządkowane rosnąco).
Rozwiązanie:
#include <iostream> #include <fstream> #define N 1000 #define T 3 using namespace std; int main() { int t[T][N]; fstream plik; plik.open("liczby.txt"); if (!plik.good()) cout << "brak pliku!"; else { for (int i=0; i<N;i++) plik >> t[0][i] >> t[1][i] >> t[2][i]; } plik.close(); // zadanie 1 int wiersz=0; for (int i=0; i<N;i++) if ((t[0][i] < t[1][i]) && (t[1][i] < t[2][i])) { cout << t[0][i] << " " << t[1][i] << " " << t[2][i] << endl; wiersz++; } fstream wynik; wynik.open("wynik4.txt", ios::out); wynik << wiersz << endl; wynik.close(); return 0; }
Komentarz:
Pobieramy dane z pliku do zmiennych tablicowych t[0][1000], t[1][1000], t[2][1000]. Następnie sprawdzamy czy liczba t1 jest mniejsza od t2 oraz cz liczba t2 jest mniejsza od t3, jeśli tak to zwiększamy wartość wiersz o jeden.
Zadanie 2.
Dla każdego wiersza wyznacz największy wspólny dzielnik (NWD) trójki liczb w nim zapisanych i podaj sumę tych dzielników.
Przykład:
Dla danych
3 6 9
34 10 4
36 20 28
16 40 56
odpowiedzią jest 17, ponieważ NWD trójek liczb w kolejnych wierszach to: 3, 2, 4, 8 (3+2+4+8=17).
Rozwiązanie:
#include <iostream> #include <fstream> #define N 1000 #define T 4 using namespace std; int NWD(int a, int b) { while (a!=b) { if (a>b) a-=b; else b-=a; } return a; } int main() { int t[T][N]; fstream plik; plik.open("liczby.txt"); if (!plik.good()) cout << "brak pliku!"; else { for (int i=0; i<N;i++) plik >> t[0][i] >> t[1][i] >> t[2][i]; } plik.close(); // zadanie 2 int suma = 0; for (int i=0; i<N;i++) { t[3][i] = NWD(NWD(t[0][i],t[1][i]),t[2][i]); suma+=t[3][i]; } fstream wynik; wynik.open("wynik4.txt", ios::out); wynik << suma << endl; wynik.close(); return 0; }
Komentarz:
Pobieramy dane z pliku do zmiennych tablicowych t[0][1000], t[1][1000], t[2][1000]. Następnie obliczamy dla każdej trójki NWD metodą Euklidesa i wynik przypisujemy do tablicy nr 4. Na koniec wykonujemy sumowanie wartości zapisanych w tablicy.
Zadanie 3.
Dla każdego wiersza oblicz sumę cyfr wszystkich liczb znajdujących się w tym wierszu.
Podaj:
- liczbę wierszy, dla których suma cyfr ze wszystkich trzech zapisanych liczb jest równa
35; - największą sumę cyfr w wierszu oraz liczbę wierszy, w których suma cyfr równa jest
tej największej wartości.
Przykład:
Dla danych
45 9151 2800
2882 15040 2800 (*)
30172 2592 1102
29121 23564 320 (*)
3 243 765
W dwóch wierszach suma cyfr jest równa 35 (wytłuszczone wiersze). Maksymalną sumą jest 40, która wystąpiła 2 razy – w wierszach oznaczonych (*).
Rozwiązanie:
#include <iostream> #include <fstream> #define N 1000 #define T 4 using namespace std; int sumacyfr(int c) { int s=0; while (c>0) { int tmp=c%10; c/=10; s+=tmp; } return s; } int main() { int t[T][N]; fstream plik; plik.open("liczby.txt"); if (!plik.good()) cout << "brak pliku!"; else { for (int i=0; i<N;i++) plik >> t[0][i] >> t[1][i] >> t[2][i]; } plik.close(); // zadanie 3 int ile = 0; int suma = 0; int maksimum = 0; int ile_maks = 0; for (int i=0; i<N;i++) { t[3][i] = sumacyfr(t[0][i])+sumacyfr(t[1][i])+sumacyfr(t[2][i]); if (t[3][i] == 35) ile++; if (maksimum<t[3][i]) maksimum = t[3][i]; } for (int i=0; i<N;i++) if (t[3][i] == maksimum) ile_maks++; fstream wynik; wynik.open("wynik4.txt", ios::out); wynik << "ilosc sumy cyfr rownych 35 : "<< ile << endl; wynik << "wartosc maksimalnej sumy cyfr rowna jest : "<< maksimum << endl; wynik << "ilosc wystepowan maksimum jest rowna : "<< ile_maks << endl; wynik.close(); return 0; }