2308 - Fractzii: Difference between revisions
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 == | ||
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 | 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 | 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, | 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 | Î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 == | ||
1 ≤ '''N, M''' ≤ 2 000 000 000 | |||
== Exemplul 1 == | == Exemplul 1 == | ||
; | ; Datele de intrare | ||
: | : Introduceti doua numere naturale: | ||
; | : 13 8 | ||
: Datele | ; Datele de ieșire | ||
: | : Datele sunt introduse corect. | ||
: 6 | |||
<br> | <br> | ||
== Rezolvare == | == Rezolvare == | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line> | ||
# | #2308 | ||
def | 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 | |||
def | fracții = fracții_nivel | ||
if n < 1 or n > | 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 | if n >= 1 and n <= 2000000000 and m >= 1 and m <= 2000000000: | ||
print("Datele sunt introduse corect.") | |||
print(nivel_fracție(n, m)) | |||
print("Datele introduse | |||
else: | else: | ||
print("Datele nu corespund restricțiilor impuse.") | |||
print("Datele | </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. |
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>
- 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.