2302 - Memory 009
Cerinţa
Se dau două șiruri de numere A și B.Calculati A ∩ B.
Date de intrare
Fișierul de intrare memory009.in conține pe prima linie numerele n, m (lungimile celor două șiruri), iar pe a doua linie n numere naturale separate prin spații, iar pe a treia linie m numere naturale separate prin spații
Date de ieșire
Dacă datele sunt introduse corect, pe ecran: "Datele sunt introduse corect.",fișierul de ieșire memory009.out va conține mulțimea M care reprezinta mulțimea A ∩ B, în ordine crescătoare. În cazul în care datele nu respectă restricțiile, se va afișa: "Datele nu corespund restricțiilor impuse.".
Restricţii şi precizări
- 1 ≤ n ≤ m ≤ 1.000.000
- numerele de pe a doua linie și a treia a fișierului de intrare vor fi mai mici sau egale cu 30
- în fișierul de ieșire nu se repetă elementele !
Exemple
Exemplul 1
- memory009.in
- 3 2
- 2 5 3
- 5 9
- ecran
- Datele sunt introduse corect.
- memory009.out
- 5
Exemplul 2
- memory009.in
- 3 4
- 1 2 3
- 2 3 4 5
- ecran
- Datele sunt introduse corect.
- memory009.out
- 2 3
Exemplul 3
- memory009.in
- 0 2
- 1 2 3
- 2 3 4 5
- ecran
- Datele nu corespund restricțiilor impuse.
- memory009.out
Rezolvare
<syntaxhighlight lang="python" line="1">
- 2302 - Memory 009
def valideaza_date(n, m, f1, f2):
if n <= 0 or m <= 0 or len(f1) != 32 or len(f2) != 32: print("Datele nu corespund restricțiilor impuse.") exit(0)
for i in range(32): if f1[i] < 0 or f2[i] < 0: print("Datele nu corespund restricțiilor impuse.") exit(0)
print("Datele sunt introduse corect.")
def rezolva(n, m, f1, f2):
with open("memory009.out", "w") as fout: for i in range(32): if f2[i] != 0 and f1[i] != 0: fout.write(str(i) + " ")
def executa():
with open("memory009.in", "r") as fin: # Citim numerele n și m de pe prima linie n, m = map(int, fin.readline().split()) f1 = [0] * 32 f2 = [0] * 32 # Citim cele n numere ale primei liste de pe a doua linie numere1 = list(map(int, fin.readline().split())) for x in numere1: f1[x] += 1 # Citim cele m numere ale celei de-a doua liste de pe a treia linie numere2 = list(map(int, fin.readline().split())) for x in numere2: f2[x] += 1
valideaza_date(n, m, f1, f2) rezolva(n, m, f1, f2)
executa()
Explicatie
Programul citeste numerele din fisierul de intrare "memory009.in" și verifică dacă acestea sunt în acord cu specificatiile problemei (n si m trebuie să fie mai mari decat 0, fiecare lista trebuie să aiba 32 de elemente, elementele din fiecare lista trebuie să fie nenegative). Dacă datele de intrare nu sunt valide, programul va afișa un mesaj corespunzător și se va opri.
Dacă datele de intrare sunt valide, programul va citi cele două liste de numere din fișierul de intrare și va stoca numărul de apariții ale fiecărui element din fiecare listă într-un vector corespunzător. Apoi, programul va parcurge aceste două vectori și va scrie în fișierul de ieșire "memory009.out" toate numerele care apar în ambele liste de numere, în ordine crescătoare.
Funcția valideaza_date verifică dacă datele de intrare sunt valide sau nu și afișează un mesaj corespunzător. Funcția rezolva scrie rezultatul în fișierul de ieșire "memory009.out". Funcția executa este funcția principală care citeste datele de intrare, validează aceste date, rezolvă problema și afișează mesaje corespunzătoare
</syntaxhighlight>