0495 - Constr2: Difference between revisions

From Bitnami MediaWiki
No edit summary
 
(One intermediate revision by the same user not shown)
Line 53: Line 53:




def citire_conform_restrictiilor():
def citire_conform_restrictiilor(vector, n):
    n = int(input())
     if n < 1 or n > 200:
     if n < 1 or n > 200:
         print("Datele nu corespund restricțiilor impuse.")
         print("Datele nu corespund restricțiilor impuse.")
         exit()
         exit()
    vector = list(map(int, input().split()))
     for x in vector:
     for x in vector:
         if x < 0 or x > 1000000000:
         if x < 0 or x > 1000000000:
Line 67: Line 65:
         exit()
         exit()
     print("Datele sunt introduse corect.")
     print("Datele sunt introduse corect.")
    return vector, n




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


if __name__ == '__main__':
 
    vector, n = citire_conform_restrictiilor()
    construirea_vect_y(vector, n)




Line 92: Line 89:


</syntaxhighlight>
</syntaxhighlight>
== 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.<br>  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.<br>  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:<br>-> se declară o listă "vector_prime" care va fi utilizată pentru a stoca valorile prime din "vector";<br>-> 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";<br>-> 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);<br>-> pentru fiecare element din "vector", la fiecare iterație;<br> 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);<br>-> 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;<br>-> î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";<br>-> 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;<br> 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);<br> 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.

Latest revision as of 09:48, 26 April 2023

Sursa: 0495 - Constr2


Cerinţa[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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

Exemple[edit | edit source]

Exemplul 1[edit | edit source]

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

Exemplul 2[edit | edit source]

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


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 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)









</syntaxhighlight>

Explicație rezolvare[edit | edit source]

  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.