2020 - Error: Difference between revisions

From Bitnami MediaWiki
Andrada378 (talk | contribs)
No edit summary
Andrada378 (talk | contribs)
 
Line 33: Line 33:
     with open("errorin.txt", "r") as infile:
     with open("errorin.txt", "r") as infile:
         n = int(infile.readline())
         n = int(infile.readline())
        if not (1 <= n <= 100000):
            raise ValueError("Numărul de teste trebuie să fie între 1 și 100.000")
         date = []
         date = []
         for _ in range(n):
         for _ in range(n):
             a, b = map(int, infile.readline().split())
             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))
             date.append((a, b))
     return n, date
     return n, date
Line 48: Line 53:
             r = (r * 10) % b
             r = (r * 10) % b
     return c
     return c


def efectueaza_transport_si_scrie_rezultatul(c):
def efectueaza_transport_si_scrie_rezultatul(c):
Line 59: Line 65:
         for j in range(1, 21):
         for j in range(1, 21):
             outfile.write(f"{c[j]} ")
             outfile.write(f"{c[j]} ")
def main():
def main():
 
    try:
    n, date = citeste_date()
        n, date = citeste_date()
    c = calculeaza_resturi_si_transport(n, date)
        c = calculeaza_resturi_si_transport(n, date)
    efectueaza_transport_si_scrie_rezultatul(c)
        efectueaza_transport_si_scrie_rezultatul(c)
    except ValueError as e:
        print(f"Eroare la citirea datelor: {e}")


if __name__ == "__main__":
if __name__ == "__main__":
     main()
     main()
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 23:18, 2 January 2024

Cerința[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

  • 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:[edit | edit source]

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[edit | edit source]

7/5=1,40000000000000000000…

Rezolvare[edit | edit source]

<syntaxhighlight lang="python"> 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()

</syntaxhighlight>