1485 - Jumatate 1: Difference between revisions

From Bitnami MediaWiki
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]

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]

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

Date de intrare[edit]

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

Date de ieșire[edit]

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]

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

Exemplu[edit]

jumatate1.in
88132
jumatate1.out
44

Explicație[edit]

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


Rezolvare[edit]

Rezolvare ver. 1[edit]

<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]

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