2020 - Error

De la Universitas MediaWiki

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 errorin.txt 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 errorout.txt 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:

errorin.txt

1

7 5

errorout.txt

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

def citeste_date():
    with open("errorin.txt", "r") as infile:
        n = int(infile.readline())
        if not (1 <= n <= 100000):
            raise ValueError("Numărul de teste trebuie să fie între 1 și 100.000")

        date = []
        for _ in range(n):
            a, b = map(int, infile.readline().split())
            if not (1 <= a < 1000) or not (1 <= b < 1000):
                raise ValueError("Numerele trebuie să fie naturale, nenule și mai mici decât 1000")
            date.append((a, b))
    return n, date


def calculeaza_resturi_si_transport(n, date):
    c = [0] * 31
    for a, b in date:
        r = a % b
        for j in range(1, 31):
            c[j] += (r * 10) // b
            r = (r * 10) % b
    return c


def efectueaza_transport_si_scrie_rezultatul(c):
    t = 0
    for j in range(30, 0, -1):
        r = (c[j] + t) % 10
        t = (c[j] + t) // 10
        c[j] = r

    with open("errorout.txt", "w") as outfile:
        for j in range(1, 21):
            outfile.write(f"{c[j]} ")


def main():
    try:
        n, date = citeste_date()
        c = calculeaza_resturi_si_transport(n, date)
        efectueaza_transport_si_scrie_rezultatul(c)
    except ValueError as e:
        print(f"Eroare la citirea datelor: {e}")

if __name__ == "__main__":
    main()