2415 - Nr Pal
Sursa: [1]
Cerinţa[edit | edit source]
Se dau numar întrebări de forma: Câte palindromuri există în intervalul [a, b]?, unde a și b sunt numere naturale date, cu a ≤ b.
Date de intrare[edit | edit source]
Fișierul de intrare nr_pal.in conține pe prima linie numărul natural nenul numar, iar pe următoarele numar linii, numar perechii de forma a b ce reprezintă capetele intervalelor.
Date de ieșire[edit | edit source]
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi, fișierul de ieșire nr_pal.out va conține răspunsurile la cele numar întrebări, fiecare pe câte un rând.. Î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]
- 0 < n ≤ 100000
- 0 ≤ a ≤ b ≤ 1.000.000.000
Exemple[edit | edit source]
Exemplul 1[edit | edit source]
- nr_pal.in
- 2
- 5 23
- 1 255
- Ecran
- Datele sunt introduse corect.
- nr_pal.out
- 7
- 34
Explicație[edit | edit source]
La prima întrebare în intervalul [5,23] exista 7 palindromuri: 5,6,7,8,9,11,22.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- 2415
def numar_palindroame(a, b):
count = 0 for i in range(a, b + 1): if str(i) == str(i)[::-1]: count += 1 return count
def citire_date(nume_fisier):
with open(nume_fisier, 'r') as f: numar = int(f.readline()) intervale = [] for i in range(numar): a, b = map(int, f.readline().split()) intervale.append((a, b)) return intervale
def main():
try: intervale = citire_date('nr_pal.in') print("Datele sunt introduse corect.") with open('nr_pal.out', 'w') as f: for a, b in intervale: f.write(str(numar_palindroame(a, b)) + '\n') except ValueError: print("Datele nu corespund restricțiilor impuse.")
if __name__ == '__main__':
main()
</syntaxhighlight>
Explicație rezolvare[edit | edit source]
Funcția numar_palindroame(a, b) primește două argumente a și b, reprezentând capetele intervalului, și calculează numărul de palindroame din intervalul dat. Inițial, variabila count este setată la 0, apoi se parcurge intervalul de la a la b + 1. Pentru fiecare număr în interval, se verifică dacă reprezentarea sa sub formă de șir de caractere este aceeași cu șirul obținut prin inversarea acestuia (str(i)[::-1] reprezintă șirul obținut prin inversarea șirului str(i)), caz în care variabila count este incrementată. Funcția returnează valoarea finală a variabilei count.
Funcția citire_date(nume_fisier) primește un singur argument nume_fisier, reprezentând numele fișierului de intrare, și returnează o listă de perechi de forma (a, b), reprezentând intervalul specificat în fiecare linie a fișierului de intrare. Funcția deschide fișierul de intrare și citește numărul de întrebări, apoi parcurge liniile rămase din fișier și extrage capetele intervalului din fiecare linie cu ajutorul funcției split(). Capetele intervalului sunt convertite la numere întregi cu ajutorul funcției int() și sunt adăugate la o listă de intervale. Funcția returnează lista de intervale.
Funcția main() reprezintă punctul de intrare în program. În primul rând, se încearcă citirea datelor de intrare folosind funcția citire_date(). Dacă datele sunt citite cu succes, se afișează un mesaj de confirmare și se deschide fișierul de ieșire. Pentru fiecare interval din lista de intervale, se calculează numărul de palindroame din interval folosind funcția numar_palindroame() și se scrie valoarea în fișierul de ieșire. Dacă apare o excepție de tipul ValueError în timpul citirii datelor de intrare, se afișează un mesaj de eroare.