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) |
||
(One intermediate revision by the same user not shown) | |||
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 intrare | |||
== 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()) | ||
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 | ||
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 62: | ||
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(): | ||
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__": | 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>