1485 - Jumatate 1

From Bitnami MediaWiki
Revision as of 18:37, 17 May 2023 by Petras.du.ioana (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Sursa: [1]


Enunt

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

Să se determine cel mai mare divizor comun al lui x și y.

Date de intrare

Fișierul de intrare jumatate1.in conține pe prima linie numărul n.

Date de ieșire

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

  • Numărul n va avea cel mult 16 cifre.

Exemplu

jumatate1.in
88132
jumatate1.out
44

Explicație

Numărul x este 88 iar numărul y este 132. Cel mai mare divizor comun al lor este 44.


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>

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>