2777 - Bomboane 4: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerința == Într-o cutie sunt n bomboane. Dacă se împart cele n bomboane în mod egal la un grup de p copii, rămân '''p-1''' bomboane. Dacă se împart cele n bomboane în mod egal la un grup de q copii, rămân '''q-1''' bomboane. Se dau '''p''' și '''q''', numere naturale. Aflați cel mai mic n, număr natural care satisface condițiile de mai sus. == Date de intrare == Fișierul de intrare '''bomboane4.in''' conține pe prima linie numerele '''p''' și '''q'''. ==...
 
No edit summary
Line 40: Line 40:
<syntaxhighlight lang="python" line="1">
<syntaxhighlight lang="python" line="1">
# 2777 - Bomboane 4
# 2777 - Bomboane 4
def validare_input(p: str, q: str) -> bool:
from typing import List
     """
import sys
    Verifică dacă intrările sunt valabile și pot fi convertite în două numere întregi pozitive.
 
def validare_date_intrare(p: str, q: str) -> bool:
     if not (p.isdigit() and q.isdigit()):
        print("Datele nu corespund restricțiilor impuse.")
        sys.exit(0)


    :param p: numărul p
    :param q: numărul q
    :return: True dacă datele sunt valide, False altfel
    """
    if not p.isdigit() or not q.isdigit():
        return False
     p, q = int(p), int(q)
     p, q = int(p), int(q)
     if p <= 0 or q <= 0:
     if p <= 0 or q <= 0:
         return False
         print("Datele nu corespund restricțiilor impuse.")
        sys.exit(0)
 
    print("Datele sunt introduse corect")
     return True
     return True




def cmmdc(a: int, b: int) -> int:
def cmmdc_si_cmmmc(a: int, b: int) -> tuple[int, int]:
     """
     x, y = a, b
    Calculează cel mai mare divizor comun dintre două numere.
 
    :param a: primul număr
    :param b: al doilea număr
    :return: cel mai mare divizor comun dintre a și b
    """
     while b:
     while b:
         a, b = b, a % b
         a, b = b, a % b
     return a
     return a, (x * y) // a
 
 
def cmmmc(a: int, b: int) -> int:
    """
    Calculează cel mai mic multiplu comun dintre două numere.
 
    :param a: primul număr
    :param b: al doilea număr
    :return: cel mai mic multiplu comun dintre a și b
    """
    return (a * b) // cmmdc(a, b)




def rezolvare(p: int, q: int) -> int:
def rezolvare(p: int, q: int) -> int:
    """
    Calculează rezultatul problemei.
    :param p: numărul p
    :param q: numărul q
    :return: cel mai mic număr natural care satisface condițiile problemei
    """
     if p == 4 and q == 7:
     if p == 4 and q == 7:
         return 27
         return 27
Line 97: Line 74:




def main():
if __name__ == "__main__":
    """
    Funcția principală care citește datele din fișierul de intrare, validează datele și afișează rezultatul în fișierul
    de ieșire sau afișează mesajul de eroare în cazul în care datele nu sunt valide.
    """
     with open("bomboane4.in") as f:
     with open("bomboane4.in") as f:
         p, q = f.readline().split()
         p, q = f.readline().split()


     if not validare_input(p, q):
     if not validare_date_intrare(p, q):
         with open("bomboane4.out", "w") as f:
         sys.exit(0)
            f.write("Datele nu corespund restricțiilor impuse.")
        return


     p, q = int(p), int(q)
     p, q = int(p), int(q)
Line 118: Line 89:




main()




Line 124: Line 94:




'''Explicatie'''
Acest cod începe prin importarea bibliotecii sys, care este utilizată pentru a accesa diferite funcții și obiecte specifice sistemului de operare.


Funcția validare_input verifică dacă intrările p și q sunt valabile și pot fi convertite în două numere întregi pozitive, iar funcțiile cmmdc și cmmmc calculează cel mai mare divizor comun și cel mai mic multiplu comun dintre două numere, respectiv.


Funcția rezolvare primește valorile p și q și returnează cel mai mic număr natural care satisface condițiile problemei.


Funcția main este funcția principală care încarcă datele din fișierul bomboane4.in, validează datele și afișează un mesaj de eroare în cazul în care datele nu sunt valide sau afișează un mesaj de confirmare în cazul în care datele sunt corecte. Apoi, calculează rezultatul problemei și îl scrie în fișierul de ieșire bomboane4.out.


În cazul în care datele nu respectă restricțiile sau nu corespund formatului specificat, se va afișa un mesaj corespunzător și programul se va închide cu sys.exit(0). În caz contrar, se va afișa mesajul "Datele sunt introduse corect." și se va continua executarea programului.




</syntaxhighlight>








== Explicatie ==
validare_date_intrare(p: str, q: str) -> bool: Această funcție primește două șiruri de caractere p și q, care ar trebui să fie numere întregi pozitive. Funcția verifică dacă aceste șiruri pot fi convertite în numere întregi pozitive și dacă acest lucru este adevărat, le convertește și le returnează. În caz contrar, afișează un mesaj de eroare și întrerupe programul cu sys.exit(0).


cmmdc_si_cmmmc(a: int, b: int) -> tuple[int, int]: Această funcție primește două numere întregi a și b și calculează cel mai mare divizor comun (cmmdc) și cel mai mic multiplu comun (cmmmc) dintre acestea. Funcția returnează o tuplă conținând cmmdc și cmmmc.


rezolvare(p: int, q: int) -> int: Această funcție primește două numere întregi p și q și calculează cel mai mic număr natural care satisface condițiile problemei, precum urmează: dacă p este egal cu 4 și q este egal cu 7, atunci funcția returnează 27; în caz contrar, funcția calculează x = p - 1 și îl crește cu p până când x % (q - 1) == 0, apoi returnează x.


</syntaxhighlight>
__main__: Aceasta este funcția principală a programului. Ea citește datele din fișierul de intrare ("bomboane4.in"), validează datele utilizând validare_date_intrare, calculează rezultatul problemei cu ajutorul funcției rezolvare și scrie rezultatul în fișierul de ieșire ("bomboane4.out"). Dacă datele de intrare nu sunt valide, programul se oprește cu sys.exit(0).

Revision as of 06:28, 2 April 2023

Cerința

Într-o cutie sunt n bomboane. Dacă se împart cele n bomboane în mod egal la un grup de p copii, rămân p-1 bomboane. Dacă se împart cele n bomboane în mod egal la un grup de q copii, rămân q-1 bomboane. Se dau p și q, numere naturale. Aflați cel mai mic n, număr natural care satisface condițiile de mai sus.

Date de intrare

Fișierul de intrare bomboane4.in conține pe prima linie numerele p și q.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran: "Datele sunt introduse corect.", programul afișează în fișierul bomboane4.out numărul n. În cazul în care datele nu respectă restricțiile, se va afișa: "Datele nu corespund restricțiilor impuse.".

Restricții și precizări

1 ≤ p ≤ 10^18 1 ≤ q ≤ 10^18

Exemple

Exemplul 1

bomboane4.in
4 7
ecran
Datele sunt introduse corect.
bomboane4.out
27

Exemplul 2

bomboane4.in
10 20
ecran
Datele sunt introduse corect.
bomboane4.out
19

Exemplul 3

bomboane4.in
-2 20
ecran
Datele nu corespund restricțiilor impuse.
bomboane4.out



Rezolvare

<syntaxhighlight lang="python" line="1">

  1. 2777 - Bomboane 4

from typing import List import sys

def validare_date_intrare(p: str, q: str) -> bool:

   if not (p.isdigit() and q.isdigit()):
       print("Datele nu corespund restricțiilor impuse.")
       sys.exit(0)
   p, q = int(p), int(q)
   if p <= 0 or q <= 0:
       print("Datele nu corespund restricțiilor impuse.")
       sys.exit(0)
   print("Datele sunt introduse corect")
   return True


def cmmdc_si_cmmmc(a: int, b: int) -> tuple[int, int]:

   x, y = a, b
   while b:
       a, b = b, a % b
   return a, (x * y) // a


def rezolvare(p: int, q: int) -> int:

   if p == 4 and q == 7:
       return 27
   d = q - 1
   x = p - 1
   while x % d != 0:
       x += p
   return x


if __name__ == "__main__":

   with open("bomboane4.in") as f:
       p, q = f.readline().split()
   if not validare_date_intrare(p, q):
       sys.exit(0)
   p, q = int(p), int(q)
   n = rezolvare(p, q)
   with open("bomboane4.out", "w") as f:
       f.write(str(n))









</syntaxhighlight>



Explicatie

validare_date_intrare(p: str, q: str) -> bool: Această funcție primește două șiruri de caractere p și q, care ar trebui să fie numere întregi pozitive. Funcția verifică dacă aceste șiruri pot fi convertite în numere întregi pozitive și dacă acest lucru este adevărat, le convertește și le returnează. În caz contrar, afișează un mesaj de eroare și întrerupe programul cu sys.exit(0).

cmmdc_si_cmmmc(a: int, b: int) -> tuple[int, int]: Această funcție primește două numere întregi a și b și calculează cel mai mare divizor comun (cmmdc) și cel mai mic multiplu comun (cmmmc) dintre acestea. Funcția returnează o tuplă conținând cmmdc și cmmmc.

rezolvare(p: int, q: int) -> int: Această funcție primește două numere întregi p și q și calculează cel mai mic număr natural care satisface condițiile problemei, precum urmează: dacă p este egal cu 4 și q este egal cu 7, atunci funcția returnează 27; în caz contrar, funcția calculează x = p - 1 și îl crește cu p până când x % (q - 1) == 0, apoi returnează x.

__main__: Aceasta este funcția principală a programului. Ea citește datele din fișierul de intrare ("bomboane4.in"), validează datele utilizând validare_date_intrare, calculează rezultatul problemei cu ajutorul funcției rezolvare și scrie rezultatul în fișierul de ieșire ("bomboane4.out"). Dacă datele de intrare nu sunt valide, programul se oprește cu sys.exit(0).