2020 - Error: Difference between revisions

From Bitnami MediaWiki
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>'''...
 
Andrada378 (talk | contribs)
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
'''''<u>Cerința</u>'''''
== 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.
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>'''''
== 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ă.
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ă.
 
'''''<u>Date de ieșire</u>'''''
 
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.
 
'''''<u>Restricții și precizări</u>'''''
 
1 ≤ n ≤ 100.000


numerele notate de Dorel sunt naturale, nenule şi mai mici decât 1000
== 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.


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)
== Restricții și precizări ==


'''''<u>Exemplu:</u>'''''
* 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)


error.in
== Exemplu: ==
errorin.txt


1
1
Line 27: Line 21:
7 5
7 5


error.out
errorout.txt


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


Explicație
== Explicație ==
 
7/5=1,40000000000000000000…
7/5=1,40000000000000000000…


'''''<u>Rezolvare</u>'''''<syntaxhighlight lang="python">
== Rezolvare ==
<syntaxhighlight lang="python">
def citeste_date():
def citeste_date():
     with open("errorin.txt", "r") as infile:
     with open("errorin.txt", "r") as infile:
        # Citește numărul de teste n
         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 = []
        # Citește perechile de valori a și b pentru fiecare test și le adaugă la lista 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))
    # Returnează numărul de teste și lista de date
     return n, date
     return n, date


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


# Funcție pentru efectuarea transportului și scrierea rezultatului în fișierul de ieșire
 
def efectueaza_transport_si_scrie_rezultatul(c):
def efectueaza_transport_si_scrie_rezultatul(c):
    # Inițializează o variabilă t la 0
     t = 0
     t = 0
    # Realizam operația de transport la depășire asupra array-ului c
     for j in range(30, 0, -1):
     for j in range(30, 0, -1):
         r = (c[j] + t) % 10
         r = (c[j] + t) % 10
Line 72: Line 62:
         c[j] = r
         c[j] = r


    # Deschidem fișierul de ieșire pentru scriere
     with open("errorout.txt", "w") as outfile:
     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):
         for j in range(1, 21):
             outfile.write(f"{c[j]} ")
             outfile.write(f"{c[j]} ")


# Funcția principală care apelează celelalte funcții pentru a executa programul
 
def main():
def main():
     # Citirea datelor de intrare
     try:
    n, date = citeste_date()
        n, date = citeste_date()
    # Calcularea resturilor și transportului
        c = calculeaza_resturi_si_transport(n, date)
    c = calculeaza_resturi_si_transport(n, date)
        efectueaza_transport_si_scrie_rezultatul(c)
     # Efectuarea transportului și scrierea rezultatului în fișierul de ieșire
     except ValueError as e:
    efectueaza_transport_si_scrie_rezultatul(c)
        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>