2308 - Fractzii: Difference between revisions

From Bitnami MediaWiki
Sinn Erich (talk | contribs)
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/4273/prodpp] == Cerinţa == Se dă numărul natural nenul '''n'''. Să se determine produsul primelor '''n''' pătrate perfecte nenule. == Date de intrare == Programul citește de la tastatură numărul '''n'''. == Date de ieșire == Programul va afișa pe ecran, mesajul "Datele introduse corespund cerințelor" și pe o linie nouă numărul '''P''' , reprezentând produsul primelor '''n''' pătrate perfecte nenule, în caz contrar prog...
 
Sinn Erich (talk | contribs)
 
(12 intermediate revisions by the same user not shown)
Line 1: Line 1:
Sursa: [https://www.pbinfo.ro/probleme/4273/prodpp]
Sursa: [https://www.pbinfo.ro/probleme/4273/prodpp]
== Cerinţa ==
== Cerinţa ==
Se dă numărul natural nenul '''n'''. Să se determine produsul primelor '''n''' pătrate perfecte nenule.
O proprietate interesanta a fracțiilor ireductibile este ca orice fracție se poate obține după următoarele reguli:
- pe primul nivel se afla fracția 1/1;
- pe al doilea nivel, în stânga fracției 1/1 de pe primul nivel, plasam fracția 1/2 iar în dreapta ei fracția 2/1;
 
nivelul 1:            1/1
nivelul 2:      1/2        2/1
 
- pe fiecare nivel k se plasează sub fiecare fracție i / j de pe nivelul de deasupra, fracția i / (i + j) în stânga, iar fracția (i + j) / j în dreapta.
 
nivelul 1:              1/1
nivelul 2:      1/2              2/1
nivelul 3:  1/3    3/2      2/3    3/1
 
 
Dându-se o fracție oarecare prin numărătorul și numitorul său, determinați numărul nivelului pe care se află fracția sau o fracție echivalentă (având aceeași valoare) cu aceasta.
 
== Date de intrare ==
== Date de intrare ==
Programul citește de la tastatură numărul '''n'''.
Programul conține pe prima linie două numere naturale nenule '''N M''', separate printr-un spațiu, reprezentând '''numărătorul și respectiv numitorul''' unei fracții.
 
== Date de ieșire ==  
== Date de ieșire ==  
Programul va afișa pe ecran, mesajul "Datele introduse corespund cerințelor" și pe o linie nouă numărul '''P''' , reprezentând produsul primelor '''n''' pătrate perfecte nenule, în caz contrar programul va afișa pe o linie noua mesajul "Datele introduse nu corespund cerintelor."
Programul va conţine o ingură linie, pe care va fi scris număr natural nenul, reprezentând numărul nivelului care corespunde fracţiei."


Dacă datele sunt introduse corect, programul va rula.
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează numărul nivelului pe care se află fracția sau o fracție echivalentă (având aceeași valoare) cu aceasta.  


În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: ''' "Datele nu corespund restricțiilor impuse.".'''
În caz contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."


== Restricţii şi precizări ==
== Restricţii şi precizări ==
* 0 < '''n''' ⩽ 10
1 ≤ '''N, M''' ≤ 2 000 000 000


== Exemplul 1 ==
== Exemplul 1 ==
; Intrare
; Datele de intrare
: 4
: Introduceti doua numere naturale:
; Ieșire
: 13 8
: Datele corespund cerințelor.
; Datele de ieșire
: 576
: Datele sunt introduse corect.
: 6
<br>
<br>


== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#4273
#2308
def patrate_perfecte(n):
def nivel_fracție(n, m):
     patrate = []
     nivel = 1
     i = 1
     fracții = [[1, 1]]
    while len(patrate) < n:
        patrat = i * i
        patrate.append(patrat)
        i += 1
    return patrate
 


def calculeaza(numbers):
    while True:
    product = 1
        fracții_nivel = []
    for number in numbers:
        for fracție in fracții:
        product *= number
            fracții_nivel.append([fracție[0], fracție[0] + fracție[1]])
    return product
            fracții_nivel.append([fracție[0] + fracție[1], fracție[1]])


        if [n, m] in fracții_nivel:
            return nivel + 1
        elif nivel == 100:  # pentru a evita o buclă infinită
            return -1


def validare_numar(n):
        fracții = fracții_nivel
     if n < 1 or n > 10:
        nivel += 1
def validare_input(n, m):
    """
    Verifică dacă datele de intrare sunt valide.
    """
     if n < 1 or n > 2000000000 or m < 1 or m > 2000000000:
         return False
         return False
     return True
     return True


if __name__ == '__main__':
    n, m = map(int, input("Introduceti doua numere naturale: ").split())


if __name__ == '__main__':
    if n >= 1 and n <= 2000000000 and m >= 1 and m <= 2000000000:
    n = int(input("Introduceți numărul n: "))
         print("Datele sunt introduse corect.")
    if not validare_numar(n):
        print(nivel_fracție(n, m))
         print("Datele introduse nu corespund cerintelor.")
     else:
     else:
        squares = patrate_perfecte(n)
         print("Datele nu corespund restricțiilor impuse.")
        product = calculeaza(squares)
 
         print("Datele introduse corespund cerintelor.")
</syntaxhighlight>
        print(product)
 
 
'''Explicatie cod:'''
 
Codul dat începe cu o funcție nivel_fracție care primește două numere întregi pozitive n și m. Scopul funcției este de a determina nivelul la care fracția n/m apare în șirul de fracții în ordine crescătoare generat astfel:
 
nivelul 1: 1/1
 
nivelul 2: 1/2, 2/1
 
nivelul 3: 1/3, 2/3, 3/2, 3/1
 
nivelul 4: 1/4, 2/4, 3/4, 4/3, 4/2, 4/1
și așa mai departe.
 
Pentru a face acest lucru, se pornește de la fracția 1/1 și se generează toate fracțiile posibile la nivelul curent, folosindu-se de fracțiile de la nivelul anterior. De exemplu, pentru a genera fracțiile nivelului 2, se iau fracțiile de la nivelul 1 și se adaugă la ele fracțiile de forma k/1 și 1/k, unde k este un număr întreg pozitiv mai mare decât 1. În cazul de față, se folosește o listă fracții pentru a ține evidența fracțiilor de la nivelul anterior, iar la fiecare iterație se creează o listă nouă fracții_nivel care conține toate fracțiile la nivelul curent, generându-se astfel toate fracțiile pentru nivelurile următoare.


Funcția se oprește când fracția n/m apare la un anumit nivel nivel și returnează nivel + 1, adică nivelul la care apare această fracție. Dacă fracția nu apare în primele 100 de niveluri, se consideră că nu apare deloc și se returnează -1.


</syntaxhighlight>
Funcția validare_input este o funcție auxiliară care verifică dacă datele de intrare sunt valide, adică dacă n și m sunt numere întregi pozitive între 1 și 2 miliarde.
 
În blocul principal, se citește de la tastatură două numere întregi pozitive n și m. Se verifică dacă datele de intrare sunt valide, apelându-se funcția validare_input, și se afișează un mesaj corespunzător. Dacă datele de intrare sunt valide, se apelează funcția nivel_fracție și se afișează rezultatul.

Latest revision as of 08:59, 29 April 2023

Sursa: [1]

Cerinţa[edit | edit source]

O proprietate interesanta a fracțiilor ireductibile este ca orice fracție se poate obține după următoarele reguli: - pe primul nivel se afla fracția 1/1; - pe al doilea nivel, în stânga fracției 1/1 de pe primul nivel, plasam fracția 1/2 iar în dreapta ei fracția 2/1;

nivelul 1: 1/1 nivelul 2: 1/2 2/1

- pe fiecare nivel k se plasează sub fiecare fracție i / j de pe nivelul de deasupra, fracția i / (i + j) în stânga, iar fracția (i + j) / j în dreapta.

nivelul 1: 1/1 nivelul 2: 1/2 2/1 nivelul 3: 1/3 3/2 2/3 3/1


Dându-se o fracție oarecare prin numărătorul și numitorul său, determinați numărul nivelului pe care se află fracția sau o fracție echivalentă (având aceeași valoare) cu aceasta.

Date de intrare[edit | edit source]

Programul conține pe prima linie două numere naturale nenule N M, separate printr-un spațiu, reprezentând numărătorul și respectiv numitorul unei fracții.

Date de ieșire[edit | edit source]

Programul va conţine o ingură linie, pe care va fi scris număr natural nenul, reprezentând numărul nivelului care corespunde fracţiei."

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează numărul nivelului pe care se află fracția sau o fracție echivalentă (având aceeași valoare) cu aceasta.

În caz contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."

Restricţii şi precizări[edit | edit source]

1 ≤ N, M ≤ 2 000 000 000

Exemplul 1[edit | edit source]

Datele de intrare
Introduceti doua numere naturale:
13 8
Datele de ieșire
Datele sunt introduse corect.
6


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 2308

def nivel_fracție(n, m):

   nivel = 1
   fracții = 1, 1
   while True:
       fracții_nivel = []
       for fracție in fracții:
           fracții_nivel.append([fracție[0], fracție[0] + fracție[1]])
           fracții_nivel.append([fracție[0] + fracție[1], fracție[1]])
       if [n, m] in fracții_nivel:
           return nivel + 1
       elif nivel == 100:  # pentru a evita o buclă infinită
           return -1
       fracții = fracții_nivel
       nivel += 1

def validare_input(n, m):

   """
   Verifică dacă datele de intrare sunt valide.
   """
   if n < 1 or n > 2000000000 or m < 1 or m > 2000000000:
       return False
   return True

if __name__ == '__main__':

   n, m = map(int, input("Introduceti doua numere naturale: ").split())
   if n >= 1 and n <= 2000000000 and m >= 1 and m <= 2000000000:
       print("Datele sunt introduse corect.")
       print(nivel_fracție(n, m))
   else:
       print("Datele nu corespund restricțiilor impuse.")

</syntaxhighlight>


Explicatie cod:

Codul dat începe cu o funcție nivel_fracție care primește două numere întregi pozitive n și m. Scopul funcției este de a determina nivelul la care fracția n/m apare în șirul de fracții în ordine crescătoare generat astfel:

nivelul 1: 1/1

nivelul 2: 1/2, 2/1

nivelul 3: 1/3, 2/3, 3/2, 3/1

nivelul 4: 1/4, 2/4, 3/4, 4/3, 4/2, 4/1 și așa mai departe.

Pentru a face acest lucru, se pornește de la fracția 1/1 și se generează toate fracțiile posibile la nivelul curent, folosindu-se de fracțiile de la nivelul anterior. De exemplu, pentru a genera fracțiile nivelului 2, se iau fracțiile de la nivelul 1 și se adaugă la ele fracțiile de forma k/1 și 1/k, unde k este un număr întreg pozitiv mai mare decât 1. În cazul de față, se folosește o listă fracții pentru a ține evidența fracțiilor de la nivelul anterior, iar la fiecare iterație se creează o listă nouă fracții_nivel care conține toate fracțiile la nivelul curent, generându-se astfel toate fracțiile pentru nivelurile următoare.

Funcția se oprește când fracția n/m apare la un anumit nivel nivel și returnează nivel + 1, adică nivelul la care apare această fracție. Dacă fracția nu apare în primele 100 de niveluri, se consideră că nu apare deloc și se returnează -1.

Funcția validare_input este o funcție auxiliară care verifică dacă datele de intrare sunt valide, adică dacă n și m sunt numere întregi pozitive între 1 și 2 miliarde.

În blocul principal, se citește de la tastatură două numere întregi pozitive n și m. Se verifică dacă datele de intrare sunt valide, apelându-se funcția validare_input, și se afișează un mesaj corespunzător. Dacă datele de intrare sunt valide, se apelează funcția nivel_fracție și se afișează rezultatul.