3050 - ncif

From Bitnami MediaWiki
Revision as of 05:59, 3 May 2023 by Cata (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cerința[edit | edit source]

Fie n un numar natural. Pentru n seturi de doua numere naturale a si b, sa se afiseze cate cifre are ab.

Date de intrare[edit | edit source]

Fișierul de intrare ncif.in conține pe prima linie numărul n, iar pe urmatoarele n linii cate doua numere naturale a si b separate prin spații.

Date de ieșire[edit | edit source]

Fișierul de ieșire ncif.out va conține un mesaj de validare a datelor ("Date de intrare valide"), și pe fiecare linie următoare un număr reprezentând câte cifre are ab. În cazul în care a sau b depășesc limitele date, se va afișa "a și b trebuie să fie între 0 și 100000". Consola va rămâne goală, întrucât mesajul de validare apare în fișier.

Restricții și precizări[edit | edit source]

  • 1 ⩽ n ⩽ 10.000
  • 0 ⩽ a, b ⩽ 100.000

Exemplu[edit | edit source]

ncif.in
4
1 1
2 10
3 9
100 100
ncif.out
Date de intrare valide
1
4
5
201

Rezolvare[edit | edit source]

<syntaxhighlight lang="python"> from math import log10


def calculeaza_numar_cifre(a: int, b: int) -> int:

   if not (0 <= a <= 100000 and 0 <= b <= 100000):
       raise ValueError("a și b trebuie să fie între 0 și 100000")
   return int(b * log10(a)) + 1


def proceseaza_intrari(n: int, intrari: list) -> list:

   rezultate = []
   for i in range(n):
       a, b = intrari[i]
       rezultate.append(calculeaza_numar_cifre(a, b))
   return rezultate


def scrie_fisier_iesire(nume_fisier: str, rezultate: list, valid: bool):

   with open(nume_fisier, "w") as f:
       if valid:
           print("Date de intrare valide", file=f)
       for r in rezultate:
           print(r, file=f)


if __name__ == "__main__":

   with open("ncif.in") as f:
       n = int(next(f))
       intrari = [list(map(int, next(f).split())) for _ in range(n)]
   rezultate = proceseaza_intrari(n, intrari)
   scrie_fisier_iesire("ncif.out", rezultate, True)

</syntaxhighlight>

Explicatie[edit | edit source]

Acest program primește un fișier de intrare "ncif.in", care conține un număr n și n perechi de numere întregi a și b. Programul calculează numărul de cifre din b la puterea a și stochează rezultatele într-un fișier de ieșire "ncif.out".

Funcția "calculeaza_numar_cifre" primește două numere întregi a și b și calculează numărul de cifre din b la puterea a, utilizând formula logaritmică.

Funcția "proceseaza_intrari" primește numărul de intrări și lista de perechi de numere întregi a și b, apoi apelază funcția "calculeaza_numar_cifre" pentru fiecare pereche de numere și stochează rezultatele într-o listă "rezultate".

Funcția "scrie_fisier_iesire" primește numele fișierului de ieșire și listă de rezultate și scrie fiecare rezultat în fișierul de ieșire.

În final, în blocul "main", programul citește datele de intrare din fișierul "ncif.in", procesează intrările și scrie rezultatele în fișierul "ncif.out".