1485 - Jumatate 1

From Bitnami MediaWiki

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

  1. Citirea datelor de intrare din fisier

with open("jumatate1.in", "r") as f_in:

   numar = f_in.readline().strip()
  1. 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()
  1. 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:]
  1. Calcularea celui mai mare divizor comun

cmmd = math.gcd(int(x), int(y))

  1. 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>