2020 - Error: Difference between revisions
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) No edit summary |
||
Line 1: | Line 1: | ||
== 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. | ||
== 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 | == 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 | 1 | ||
Line 27: | Line 21: | ||
7 5 | 7 5 | ||
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… | ||
== Rezolvare == | |||
<syntaxhighlight lang="python"> | |||
def citeste_date(): | def citeste_date(): | ||
with open("errorin.txt", "r") as infile: | with open("errorin.txt", "r") as infile: | ||
n = int(infile.readline()) | n = int(infile.readline()) | ||
date = [] | date = [] | ||
for _ in range(n): | for _ in range(n): | ||
a, b = map(int, infile.readline().split()) | a, b = map(int, infile.readline().split()) | ||
date.append((a, b)) | date.append((a, b)) | ||
return n, date | return n, date | ||
def calculeaza_resturi_si_transport(n, date): | def calculeaza_resturi_si_transport(n, date): | ||
c = [0] * 31 | c = [0] * 31 | ||
for a, b in date: | for a, b in date: | ||
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 | ||
return c | return c | ||
def efectueaza_transport_si_scrie_rezultatul(c): | def efectueaza_transport_si_scrie_rezultatul(c): | ||
t = 0 | t = 0 | ||
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 56: | ||
c[j] = r | c[j] = r | ||
with open("errorout.txt", "w") as outfile: | with open("errorout.txt", "w") as outfile: | ||
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(): | ||
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) | ||
Revision as of 21:53, 2 January 2024
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
<syntaxhighlight lang="python"> def citeste_date():
with open("errorin.txt", "r") as infile: n = int(infile.readline()) date = [] for _ in range(n): a, b = map(int, infile.readline().split()) 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():
n, date = citeste_date() c = calculeaza_resturi_si_transport(n, date) efectueaza_transport_si_scrie_rezultatul(c)
if __name__ == "__main__":
main()
</syntaxhighlight>