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