0239 - NrLipsa: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/239/nrlipsa - NrLipsa] ---- == Cerinţa == Se dau mai multe numere naturale cu cel mult '''9''' cifre fiecare. Să se determine cele mai mari două numere de '''3''' cifre care nu se găsesc printre numerele date. == Date de intrare == Fişierul de intrare '''nrlipsa.in''' conţine cel mult '''100.000''' de numere, dispuse pe mai multe linii, numerele de pe fiecare linie fiind separate prin unul sau mai multe spaţii. == Date de ieșire...
 
No edit summary
 
(One intermediate revision by the same user not shown)
Line 22: Line 22:
===Exemplul 2===
===Exemplul 2===
; nrlipsa.in
; nrlipsa.in
: 1000001 214141251521
: 100 101 102 (...) 997 998 999
; Ieșire
; Ieșire
: Datele sunt corecte.
: Datele sunt corecte.
Line 29: Line 29:
===Exemplul 3===
===Exemplul 3===
; nrlipsa.in
; nrlipsa.in
: 1000 10001 100023 213123
: 1 1 1 1 1 1... (de 100001 ori)
; Ieșire
; Ieșire
: Datele sunt corecte.
: Datele nu sunt comform restricțiilor impuse.
; nrlipsa.out
: 999 998
<br>
<br>
== Rezolvare ==  
== Rezolvare ==  
Line 84: Line 82:


</syntaxhighlight>
</syntaxhighlight>
==Explicaţie cod==
Da, acesta este un program care verifică dacă există două numere lipsă între 100 și 999 într-un vector dat și afișează aceste numere într-un fișier de ieșire.
Iată o explicație detaliată a codului:
- Funcția '''nrlipsa(vector_verificare)''' primește vectorul verificat de conformitate cu restricțiile și verifică dacă există două numere lipsă între 100 și 999 în vector.
    - Inițial, variabilele '''i''' și '''j''' sunt setate la 0. Acestea vor fi folosite pentru a stoca numerele lipsă.
    - Apoi, un buclă '''for''' rulează invers de la 999 la 100 și verifică dacă elementul de pe acea poziție din vectorul verificat este 0. Dacă este așa, înseamnă că acel număr nu există în vectorul dat și trebuie stocat în '''i''' sau '''j'''.
    - Dacă două numere lipsă sunt găsite, funcția va scrie aceste numere în fișierul de ieșire. În caz contrar, va scrie "NU".
- Funcția '''conform_restrictiilor()''' citeste datele din fișierul de intrare și verifica daca sunt conforme cu restricțiile impuse.
    - În primul rând, variabilele '''vector''' și '''vector_verificare''' sunt inițializate. '''vector''' va fi folosit pentru a stoca datele din fișierul de intrare și '''vector_verificare''' va fi folosit pentru a verifica daca numerele între 100 și 999 există în vectorul dat.
    - Apoi, fișierul de intrare este deschis și datele sunt citite și stocate în variabila '''vector'''.
    - Dacă numărul de elemente din '''vector''' depășește 100000, funcția va afișa un mesaj de eroare și se va opri.
    - Pentru fiecare element din '''vector''', funcția verifică dacă acesta este negativ, sau dacă depășește valoarea maximă admisă de 1000000. De asemenea, dacă un element este între 100 și 999, variabila '''vector_verificare''' va fi actualizată la poziția respectivă pentru a indica faptul că acel număr există în vectorul dat.
    - Dacă datele sunt conforme, funcția va returna vectorul '''vector_verificare''' pentru a fi folosit de funcția '''nrlipsa()'''.
- În blocul principal, mai întâi se apelează funcția '''conform_restrictiilor()''' pentru a verifica datele din fișierul de intrare. Dacă datele sunt conforme, se va apela funcția `nrlipsa()` pentru a căuta două numere lipsă și a le scrie în fișierul de ieșire.

Latest revision as of 13:18, 30 April 2023

Sursa: - NrLipsa


Cerinţa[edit | edit source]

Se dau mai multe numere naturale cu cel mult 9 cifre fiecare. Să se determine cele mai mari două numere de 3 cifre care nu se găsesc printre numerele date.

Date de intrare[edit | edit source]

Fişierul de intrare nrlipsa.in conţine cel mult 100.000 de numere, dispuse pe mai multe linii, numerele de pe fiecare linie fiind separate prin unul sau mai multe spaţii.

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.", iar apoi in fişierul de ieşire nrlipsa.out va conţine pe prima linie cele mai mari două numere de trei cifre care nu apar în fişierul de intrare, ordonate descrescător, separate prin exact un spaţiu. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".

Restricţii şi precizări[edit | edit source]

  • Dacă nu există două numere de trei cifre care să nu se afle în fişierul de intrare atunci se va afişa mesajul NU.

Exemple[edit | edit source]

Exemplul 1[edit | edit source]

nrlipsa.in
12 2345 123 67 989 6 999
123 67 989 999
Ieșire
Datele sunt corecte.
nrlipsa.out
998 997

Exemplul 2[edit | edit source]

nrlipsa.in
100 101 102 (...) 997 998 999
Ieșire
Datele sunt corecte.
nrlipsa.out
NU

Exemplul 3[edit | edit source]

nrlipsa.in
1 1 1 1 1 1... (de 100001 ori)
Ieșire
Datele nu sunt comform restricțiilor impuse.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 0239 NrLipsa

def nrlipsa(vector_verificare):

   i = 0;
   j = 0
   for k in range(999, 100, -1):
       if vector_verificare[k] == 0:
           if i == 0:
               i = k
           elif j == 0:
               j = k
           else:
               break
   f = open("nrlipsa.out", "w")
   if i != 0 and j != 0:
       line = [str(i), " ", str(j)]
       f.writelines(line)
   else:
       f.write("NU")

def conform_restrictiilor():

   vector = list()
   vector_verificare = [0] * 1000
   with open('nrlipsa.in') as f:
       lines = f.readlines()
       for line in lines:
           for c in line.split():
               if c.isdigit() == True:
                   vector.append(int(c))
   if len(vector) > 100000:
       print("Datele nu sunt comform restricțiilor impuse.")
       exit()
   for x in vector:
       if x < 0 or x >= 1000000:
           print("Datele nu sunt comform restricțiilor impuse.")
           exit()
       if x >= 100 and x <= 999:
           vector_verificare[x] = 1
   print("Datele sunt corecte.")
   return vector_verificare

if __name__ == '__main__':

   vector_verificare = conform_restrictiilor()
   nrlipsa(vector_verificare)

</syntaxhighlight>

Explicaţie cod[edit | edit source]

Da, acesta este un program care verifică dacă există două numere lipsă între 100 și 999 într-un vector dat și afișează aceste numere într-un fișier de ieșire.

Iată o explicație detaliată a codului:

- Funcția nrlipsa(vector_verificare) primește vectorul verificat de conformitate cu restricțiile și verifică dacă există două numere lipsă între 100 și 999 în vector.

   - Inițial, variabilele i și j sunt setate la 0. Acestea vor fi folosite pentru a stoca numerele lipsă. 
   - Apoi, un buclă for rulează invers de la 999 la 100 și verifică dacă elementul de pe acea poziție din vectorul verificat este 0. Dacă este așa, înseamnă că acel număr nu există în vectorul dat și trebuie stocat în i sau j.
   - Dacă două numere lipsă sunt găsite, funcția va scrie aceste numere în fișierul de ieșire. În caz contrar, va scrie "NU".

- Funcția conform_restrictiilor() citeste datele din fișierul de intrare și verifica daca sunt conforme cu restricțiile impuse.

   - În primul rând, variabilele vector și vector_verificare sunt inițializate. vector va fi folosit pentru a stoca datele din fișierul de intrare și vector_verificare va fi folosit pentru a verifica daca numerele între 100 și 999 există în vectorul dat.
   - Apoi, fișierul de intrare este deschis și datele sunt citite și stocate în variabila vector.
   - Dacă numărul de elemente din vector depășește 100000, funcția va afișa un mesaj de eroare și se va opri.
   - Pentru fiecare element din vector, funcția verifică dacă acesta este negativ, sau dacă depășește valoarea maximă admisă de 1000000. De asemenea, dacă un element este între 100 și 999, variabila vector_verificare va fi actualizată la poziția respectivă pentru a indica faptul că acel număr există în vectorul dat.
   - Dacă datele sunt conforme, funcția va returna vectorul vector_verificare pentru a fi folosit de funcția nrlipsa().

- În blocul principal, mai întâi se apelează funcția conform_restrictiilor() pentru a verifica datele din fișierul de intrare. Dacă datele sunt conforme, se va apela funcția `nrlipsa()` pentru a căuta două numere lipsă și a le scrie în fișierul de ieșire.