Matura 2017 (maj). Zadanie 1. Prostokąt

Matura 2017 (maj). Zadanie 1. Prostokąt

Dane są:

liczba całkowita n większa od 1
zbiór A zawierający n dodatnich, różnych liczb całkowitych
liczba pierwsza p

Zadanie 1.

Dla danych z każdego wiersza w tabeli oblicz największe pole powierzchni prostokąta, które nie jest podzielne przez p, a długości sąsiednich boków tego prostokąta są różne (nie może on być kwadratem) i należą do zbioru A. Zapisz pole tego prostokąta w kolumnie S. Jeżeli taki prostokąt nie istnieje, jako wynik podaj liczbę 0 (zero).

Zbiór A p S – pole szukanego prostokąta lub 0 (zero), jeśli nie można zbudować takiego prostokąta
7, 5, 11, 33 3 77
15, 12, 10, 6, 5, 1 5 72 (6*12)
6, 28, 7, 12, 10, 14, 5, 9, 4, 8, 18 7 216 (18*12)
4, 34, 16, 8, 6, 22, 14, 12, 2, 7 2 0

Rozwiązanie:

Krok 1. 

Szukając największe pole powierzchni prostokąta, które nie jest podzielne przez p rozpocząć należy od odrzucenia liczb podzielnych przez liczbę p.

15, 12, 10, 6, 5, 1
6, 28, 7, 12, 10, 14, 5, 9, 4, 8, 18
4, 34, 16, 8, 6, 22, 14, 12, 2, 7

Krok 2.

Wybieramy dwie największe liczby spośród pozostałych, wykonujemy iloczyn, wynik sprawdzamy czy nie est podzielny przez p.

12*6=72
18*12=216
7*—– brak drugiej liczby

Zadanie 2. 

Zapisz (w postaci pseudokodu, listy kroków lub w wybranym języku programowania) algorytm obliczający największe pole powierzchni prostokąta, które nie jest podzielne przez p, a długości sąsiednich boków tego prostokąta należą do zbioru A i są różne.
Przy ocenie brana będzie pod uwagę złożoność obliczeniowa Twojego algorytmu.

Uwaga:
W zapisie algorytmu możesz wykorzystywać tylko następujące operacje arytmetyczne: dodawanie, odejmowanie, mnożenie, dzielenie całkowite i obliczanie reszty z dzielenia.

Specyfikacja:

Dane:

n – liczba całkowita większa od 1
A[1..n] – tablica zawierająca n różnych, dodatnich liczb całkowitych
p – liczba pierwsza

Wynik:

S – największe pole powierzchni prostokąta, które nie jest podzielne przez p,
a długości sąsiednich boków tego prostokąta są różne i zawarte w tablicy A;
jeśli nie można zbudować takiego prostokąta, wynikiem powinno być 0 (zero)

Rozwiązanie:

#include <iostream>
#define N 11
#define P 7

using namespace std;

int main()
{
    int tab[N]={6, 28, 7, 12, 10, 14, 5, 9, 4, 8, 18};
    int x=0,y=0;
    for (int i=0; i<N; i++) {
        if (tab[i]%P!=0) {
            if (tab[i] > x ) x = tab[i];
        }
    }
    for (int i=0; i<N; i++) {
        if (tab[i]%P!=0) {
            if (tab[i] > y && tab[i] < x ) y = tab[i];
        }
    }
    if (x*y>0)
        cout << "Pole prostokata = " << x << " * " << y << " = " << x*y << endl;
    else
        cout << "Wynik = 0 " << endl;
    return 0;
}