2020 - Error

From Bitnami MediaWiki
Revision as of 19:01, 29 December 2023 by Andrada378 (talk | contribs) (Pagină nouă: '''''<u>Cerința</u>''''' Dorel trebuie să repare reţeaua de alimentare cu apă din oraşul lui. Pentru fiecare din cele n străzi Dorel şi-a notat două numere naturale, raportul lor fiind lungimea conductei care trebuie înlocuită pe acea stradă. Pentru a destrăma mitul “Dorel, instalatorul dezastru”, el vă roagă să aflaţi lungimea totală a conductei de care are nevoie pentru a repara toate străzile, cu 20 de zecimale exacte. '''''<u>Date de intrare</u>'''...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cerința

Dorel trebuie să repare reţeaua de alimentare cu apă din oraşul lui. Pentru fiecare din cele n străzi Dorel şi-a notat două numere naturale, raportul lor fiind lungimea conductei care trebuie înlocuită pe acea stradă. Pentru a destrăma mitul “Dorel, instalatorul dezastru”, el vă roagă să aflaţi lungimea totală a conductei de care are nevoie pentru a repara toate străzile, cu 20 de zecimale exacte.

Date de intrare

Fișierul de intrare error.in conține pe prima linie numărul n, iar pe următoarele n linii câte două numere naturale nenule reprezentând numărătorul, respectiv numitorul raportului ce reprezintă lungimea conductei ce trebuie înlocuită pe strada respectivă.

Date de ieșire

Fișierul de ieșire error.out va conține pe prima linie primele 20 de zecimale ale lungimii totale a conductei, despărţite prin spaţiu.

Restricții și precizări

1 ≤ n ≤ 100.000

numerele notate de Dorel sunt naturale, nenule şi mai mici decât 1000

pentru fiecare zecimală corectă, începând de la virgulă, se primeşte câte 1p ( dacă o zecimală e greşită, pentru următoarele după ea nu se mai acordă puncte)

Exemplu:

error.in

1

7 5

error.out

4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Explicație

7/5=1,40000000000000000000…

Rezolvare<syntaxhighlight lang="python"> def citeste_date():

   with open("errorin.txt", "r") as infile:
       # Citește numărul de teste n
       n = int(infile.readline())
       date = []
       # Citește perechile de valori a și b pentru fiecare test și le adaugă la lista date
       for _ in range(n):
           a, b = map(int, infile.readline().split())
           date.append((a, b))
   # Returnează numărul de teste și lista de date
   return n, date
  1. Funcție pentru calcularea resturilor și transportului

def calculeaza_resturi_si_transport(n, date):

   # Inițializează un array c cu 31 de elemente, toate setate la 0
   c = [0] * 31
   # Parcurge datele de intrare pentru fiecare test
   for a, b in date:
       # Calculează restul și actualizează array-ul c
       r = a % b
       for j in range(1, 31):
           c[j] += (r * 10) // b
           r = (r * 10) % b
   # Returnează array-ul c
   return c
  1. Funcție pentru efectuarea transportului și scrierea rezultatului în fișierul de ieșire

def efectueaza_transport_si_scrie_rezultatul(c):

   # Inițializează o variabilă t la 0
   t = 0
   # Realizam operația de transport la depășire asupra array-ului c
   for j in range(30, 0, -1):
       r = (c[j] + t) % 10
       t = (c[j] + t) // 10
       c[j] = r
   # Deschidem fișierul de ieșire pentru scriere
   with open("errorout.txt", "w") as outfile:
       # Scrie primele 20 de elemente ale array-ului c în fișierul de ieșire
       for j in range(1, 21):
           outfile.write(f"{c[j]} ")
  1. Funcția principală care apelează celelalte funcții pentru a executa programul

def main():

   # Citirea datelor de intrare
   n, date = citeste_date()
   # Calcularea resturilor și transportului
   c = calculeaza_resturi_si_transport(n, date)
   # Efectuarea transportului și scrierea rezultatului în fișierul de ieșire
   efectueaza_transport_si_scrie_rezultatul(c)

if __name__ == "__main__":

   main()

</syntaxhighlight>