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

 

Matura 2017 (maj). Zadanie 2. Liczby pierwsze

Matura 2017 (maj). Zadanie 2. Liczby pierwsze

Parą liczb bliźniaczych nazwiemy dwie liczby pierwsze różniące się o 2. Liczbami bliźniaczymi są 11 i 13, gdyż obie liczby są pierwsze i różnica pomiędzy nimi wynosi 2. Para 13 i 15 nie jest parą liczb bliźniaczych, gdyż 15 jest liczbą złożoną.

Zadanie 1.

Uzupełnij poniższą tabelę. Wykonaj obliczenia i podaj odpowiedź, czy istnieje taka liczba, z którą liczba a tworzy parę liczb bliźniaczych.

Liczba a Czy liczba a jest pierwsza? Liczba b1=a+2 Czy liczba b1 jest pierwsza? Liczba b2=a–2 Czy liczba b2 jest pierwsza? Czy istnieje taka liczba b, z którą liczba a tworzy parę liczb bliźniaczych?
17 tak 19 tak 15 nie TAK
5 tak 7 tak 3 tak TAK
31 tak  33  nie  29 tak  TAK
41 tak  43  tak  39  nie  TAK
49 nie  51  nie  47  tak  NIE

Rozwiązanie:

Liczba pierwsza jest to taka liczba naturalna większa od 1, która posiada dokładnie dwa dzielniki: 1 i samą siebie. Sprawdzamy każdą liczby a czy jest to liczba pierwsza, jeśli nie to nawet nie musimy sprawdzać kolejnych liczb, zaś jeśli tak to sprawdzamy liczby b1=a-2 oraz b2=a+2. Jeśli, któraś z liczb b1, b2 jest liczbą pierwszą to wtedy mówimy, że liczby tworzą parę liczb bliźniaczych.

Zadanie 2.

Zapisz algorytm (w postaci listy kroków, schematu blokowego lub w wybranym języku programowania) sprawdzający, czy dana liczba należy do pary liczb bliźniaczych. Twój algorytm powinien być zgodny z poniższą specyfikacją.

Uwaga: w zapisie możesz wykorzystać tylko operacje dodawania, odejmowania, mnożenia, dzielenia, dzielenia całkowitego i brania reszty z dzielenia całkowitego, operacje logiczne oraz samodzielnie napisane funkcje.

Specyfikacja algorytmu:

Dane:

a – dodatnia liczba całkowita, a ≥ 3

Wynik:

komunikat TAK, jeżeli a należy do pary liczb bliźniaczych
komunikat NIE, jeżeli a nie należy do pary liczb bliźniaczych

Algorytm:

#include <iostream>
#include <math.h>
using namespace std;
bool czypierwsza(int a) {
  bool spr;
  if(a<2) spr = false;
  //gdy liczba jest mniejsza niz 2 to nie jest pierwsza
  for(int i=2;i<=sqrt(a);i++) {
    if(a%i==0) {
      spr = false;
      break;
    }
    spr = true;
  }
  return spr;
}
int main()
{
 cout << "Podaj liczbe: ";
 int liczba;
 cin >> liczba;
 if (( czypierwsza(liczba)&& czypierwsza(liczba-2)) || (czypierwsza(liczba) && czypierwsza(liczba+2)))
   cout << "TAK";
 else
   cout << "NIE" << endl;
 return 0;
}