0495 - Constr2

De la Universitas MediaWiki

Sursa: 0495 - Constr2


Cerinţa

Se dă un vector x cu n elemente, numere naturale. Să se construiască un alt vector, y, care să conțină elementele prime din x, în ordine inversă.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi n numere naturale, separate prin spaţii, reprezentând elementele vectorului.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează elementele vectorului y, separate prin exact un spațiu. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".

Restricţii şi precizări

  • 1 ⩽ n ⩽ 200
  • elementele vectorului vor fi cuprinse între 0 și 1.000.000.000

Exemple

Exemplul 1

Intrare
6
50 5 15 29 13 40
Ieșire
Datele sunt introduse corect.
13 29 5

Exemplul 2

Intrare
5
10 2 -3 4 5
Ieșire
Datele nu corespund restricțiilor impuse.


Rezolvare

# 0495

def construirea_vect_y(vector, n):
    vector_prime = []
    contor = 0
    for i in range(n - 1, -1, -1):
        prim = True
        if vector[i] < 2:
            prim = False
        elif vector[i] % 2 == 0 and vector[i] > 2:
            prim = False
        else:
            for d in range(3, int(vector[i] ** 0.5) + 1, 2):
                if vector[i] % d == 0:
                    prim = False
                    break
        if prim:
            vector_prime.append(vector[i])
            contor += 1
    for i in range(0, contor):
        print(vector_prime[i], end=' ')


def citire_conform_restrictiilor(vector, n):
    if n < 1 or n > 200:
        print("Datele nu corespund restricțiilor impuse.")
        exit()
    for x in vector:
        if x < 0 or x > 1000000000:
            print("Datele nu corespund restricțiilor impuse.")
            exit()
    if n != len(vector):
        print("Datele nu corespund restricțiilor impuse.")
        exit()
    print("Datele sunt introduse corect.")


if __name__ == '__main__':
    n = int(input())
    vector = list(map(int, input().split()))
    citire_conform_restrictiilor(vector, n)
    construirea_vect_y(vector, n)

Explicație rezolvare

  Secțiunea if name == 'main': reprezintă punctul de intrare în program, adică funcția principală "main()". În interiorul acestei secțiuni, se citește de la tastatură valoarea lui "n" utilizând funcția "input()" și se stochează în variabila "n" ca un întreg utilizând funcția "int()". Apoi, se citește de la tastatură elementele vectorului "vector" utilizând funcția "input()", care sunt separate prin spații și convertite într-un vector de întregi utilizând funcția "split()" și funcția "map()" împreună. Apoi, se apelează funcția "citire_conform_restrictiilor(vector, n)" pentru a verifica dacă valorile citite respectă restricțiile impuse. Dacă această verificare este trecută cu succes, se apelează funcția "construirea_vect_y(vector, n)" pentru a construi vectorul "vector_prime" și a afișa valorile primelor din acest vector.
Funcția citire_conform_restrictiilor(vector, n) primește doi parametri: "vector" și "n". Aceasta verifică dacă valorile lui "n" și elementele din "vector" respectă restricțiile impuse. Restricțiile impuse sunt următoarele: "n" trebuie să fie între 1 și 200, elementele din "vector" trebuie să fie între 0 și 1000000000, și numărul de elemente din "vector" trebuie să fie egal cu "n". Verificarea se face utilizând statement-uri "if". Dacă una dintre aceste restricții nu este îndeplinită, se afișează "Datele nu corespund restricțiilor impuse." utilizând funcția "print()" și se folosește funcția "exit()" pentru a încheia execuția programului. Dacă restricțiile sunt respectate, se afișează "Datele sunt introduse corect." și se continuă programul.
Funcția construirea_vect_y(vector, n) primește doi parametri: "vector" și "n", reprezentând un vector de numere întregi și dimensiunea acestuia. Scopul acestei funcții este să construiască un alt vector, vector_prime, care să conțină doar valorile prime din vectorul inițial, în ordine inversă. Acest lucru se realizează astfel:
-> se declară o listă "vector_prime" care va fi utilizată pentru a stoca valorile prime din "vector";
-> se declară o variabilă "contor" inițializată cu valoarea 0, care va fi utilizată pentru a număra câte valori prime sunt adăugate în "vector_prime";
-> se parcurge vectorul "vector" cu ajutorul unui for loop de la indexul "n-1" până la indexul 0, utilizând un ciclu "for" cu o iterație inversă, adică de la "n-1" până la 0, cu un pas de -1 (începem vectorul de pe poziția 0);
-> pentru fiecare element din "vector", la fiecare iterație;
se inițializează o variabilă prim cu valoarea booleană True (care va fi la început True pentru fiecare element din vector deoarece se inițializează la începutul for loop-ului);
-> dacă elementul din "vector" este mai mare sau egal cu 2 și este un număr par, atunci acesta nu poate fi prim, și se setează variabila "prim" la False;
-> în caz contrar, se parcurge un alt ciclu "for" de la 3 până la radicalul pătrat al valorii din "vector" + 1, cu un pas de 2 (deoarece numerele pare mai mari decât 2 nu pot fi prime, iar numerele prime sunt întotdeauna impare, cu excepția valorii 2). În interiorul acestul for loop, se verifică dacă valoarea din "vector" este divizibilă cu un număr din intervalul [3, radical pătrat al valorii din "vector"] (exclusiv). Dacă este divizibilă, atunci nu este primă, iar variabila "prim" este setată la False și se iese din ciclul "for" utilizând instrucțiunea "break";
-> dacă nu a fost găsită nicio valoare cu care să fie divizibilă valoarea din "vector", atunci aceasta este primă, iar variabila "prim" rămâne de la început True;
dacă variabila "prim" este True, adică valoarea din "vector" este primă, atunci aceasta este adăugată în "vector_prime" utilizând funcția "append()", și "contor" este incrementat (contor este lungimea vectorului vector_prime);
după ce am terminat cu acest for loop, adăugăm încă unul care parcurge vector_prime și afișează toate elementele din acesta, ele fiind ceea ce problema noastră ne cere.