Matura 2017 (maj). Zadanie 4. Trójki liczb

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].

Plik do pobrania.

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

 

Leave a Reply

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>