1485 - Jumatate 1
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>