1485 - Jumatate 1: Difference between revisions
Am creat de la zero. |
No edit summary |
||
Line 27: | Line 27: | ||
== Rezolvare == | == Rezolvare == | ||
=== Rezolvare ver. 1 === | |||
<syntaxhighlight lang="python" line> | |||
import math | |||
def calculeaza_cmmd(x, y): | |||
# Calculează cel mai mare divizor comun folosind funcția gcd din modulul math | |||
return math.gcd(x, y) | |||
def citeste_intrare(numefisier): | |||
# Citește numărul din fișierul de intrare specificat și returnează valoarea citită | |||
with open(numefisier, "r") as f: | |||
numar = f.readline().strip() | |||
return numar | |||
def scrie_iesire(numefisier, rezultat): | |||
# Scrie rezultatul în fișierul de ieșire specificat | |||
with open(numefisier, "w") as f: | |||
f.write(str(rezultat)) | |||
def valideaza_intrare(numar): | |||
# Verifică dacă numărul este valid | |||
if not numar.isdigit(): | |||
print("Numărul introdus nu este valid.") | |||
exit() | |||
elif len(numar) > 16: | |||
print("Numărul introdus este prea mare.") | |||
exit() | |||
def impartire_numar(numar): | |||
# Împarte numărul în două părți, x și y, în funcție de paritatea lungimii | |||
lungime_numar = len(numar) | |||
if lungime_numar % 2 == 0: | |||
x = int(numar[:lungime_numar//2]) | |||
y = int(numar[lungime_numar//2:]) | |||
else: | |||
x = int(numar[:(lungime_numar-1)//2]) | |||
y = int(numar[(lungime_numar-1)//2:]) | |||
if y == 0: | |||
# Verifică dacă y are o singură cifră și este zero | |||
y = int(numar[(lungime_numar-1)//2:(lungime_numar+1)//2] + numar[(lungime_numar+1)//2:]) | |||
return x, y | |||
if __name__ == "__main__": | |||
numefisier_intrare = "jumatate1.in" | |||
numefisier_iesire = "jumatate1.out" | |||
numar = citeste_intrare(numefisier_intrare) | |||
valideaza_intrare(numar) | |||
x, y = impartire_numar(numar) | |||
cmmd = calculeaza_cmmd(x, y) | |||
scrie_iesire(numefisier_iesire, cmmd) | |||
print("Numărul introdus este valid.") | |||
</syntaxhighlight> | |||
=== Rezolvare ver. 2 === | |||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line> | ||
Latest revision as of 18:37, 17 May 2023
Sursa: [1]
Enunt[edit | edit source]
Se citește un număr natural n. Acest număr se “împarte” în alte două numere x și y, astfel: x este format din cifrele din prima jumătate a lui n, y este format din cifrele din a doua jumătate a lui n. Dacă n are număr impar de cifre, cifra din mijloc va fi prima cifră a lui y. De exemplu, dacă n=88132, atunci x=88, iar y=132.
Cerinţa[edit | edit source]
Să se determine cel mai mare divizor comun al lui x și y.
Date de intrare[edit | edit source]
Fișierul de intrare jumatate1.in conține pe prima linie numărul n.
Date de ieșire[edit | edit source]
Fișierul de ieșire jumatate1.out va conține pe prima linie cel mai mare divizor comun al lui x și y.
Restricţii şi precizări[edit | edit source]
- Numărul n va avea cel mult 16 cifre.
Exemplu[edit | edit source]
- jumatate1.in
- 88132
- jumatate1.out
- 44
Explicație[edit | edit source]
Numărul x este 88 iar numărul y este 132. Cel mai mare divizor comun al lor este 44.
Rezolvare[edit | edit source]
Rezolvare ver. 1[edit | edit source]
<syntaxhighlight lang="python" line>
import math
def calculeaza_cmmd(x, y):
# Calculează cel mai mare divizor comun folosind funcția gcd din modulul math return math.gcd(x, y)
def citeste_intrare(numefisier):
# Citește numărul din fișierul de intrare specificat și returnează valoarea citită with open(numefisier, "r") as f: numar = f.readline().strip() return numar
def scrie_iesire(numefisier, rezultat):
# Scrie rezultatul în fișierul de ieșire specificat with open(numefisier, "w") as f: f.write(str(rezultat))
def valideaza_intrare(numar):
# Verifică dacă numărul este valid if not numar.isdigit(): print("Numărul introdus nu este valid.") exit() elif len(numar) > 16: print("Numărul introdus este prea mare.") exit()
def impartire_numar(numar):
# Împarte numărul în două părți, x și y, în funcție de paritatea lungimii lungime_numar = len(numar) if lungime_numar % 2 == 0: x = int(numar[:lungime_numar//2]) y = int(numar[lungime_numar//2:]) else: x = int(numar[:(lungime_numar-1)//2]) y = int(numar[(lungime_numar-1)//2:])
if y == 0: # Verifică dacă y are o singură cifră și este zero y = int(numar[(lungime_numar-1)//2:(lungime_numar+1)//2] + numar[(lungime_numar+1)//2:])
return x, y
if __name__ == "__main__":
numefisier_intrare = "jumatate1.in" numefisier_iesire = "jumatate1.out"
numar = citeste_intrare(numefisier_intrare) valideaza_intrare(numar) x, y = impartire_numar(numar) cmmd = calculeaza_cmmd(x, y) scrie_iesire(numefisier_iesire, cmmd)
print("Numărul introdus este valid.")
</syntaxhighlight>
Rezolvare ver. 2[edit | edit source]
<syntaxhighlight lang="python" line>
import math
- Citirea datelor de intrare din fisier
with open("jumatate1.in", "r") as f_in:
numar = f_in.readline().strip()
- Verificarea validității datelor de intrare
if not numar.isdigit():
print("Numarul introdus nu este valid.") exit()
elif len(numar) > 16:
print("Numarul introdus este prea mare.") exit()
- Determinarea numerelor x si y
lungime_numar = len(numar) if lungime_numar % 2 == 0:
x = numar[:lungime_numar//2] y = numar[lungime_numar//2:]
else:
x = numar[:(lungime_numar-1)//2] y = numar[(lungime_numar-1)//2:]
if y[0] == '0': y = numar[(lungime_numar-1)//2:(lungime_numar+1)//2] + numar[(lungime_numar+1)//2:]
- Calcularea celui mai mare divizor comun
cmmd = math.gcd(int(x), int(y))
- Scrierea rezultatului in fisierul de iesire
with open("jumatate1.out", "w") as f_out:
f_out.write(str(cmmd))
print("Numarul introdus este valid.")
</syntaxhighlight>