2020 - Error
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
- 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
- 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]} ")
- 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>