1956 - Siruri 2: 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)
 
(14 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.
Fibonacci, un celebru matematician italian din Evul Mediu, a descoperit un șir de numere naturale cu multiple aplicații, șir ce-i poartă numele:
 
Fibonacci(n)={1Fibonacci(n−1)+Fibonacci(n−2)dacă n=1 sau n=2 dacă n>2
Fascinat de șirul lui Fibonacci, și mai ales aplicațiile acestui șir în natură, Iccanobif, un matematician în devenire, a creat un șir si el un care-i poartă numele:
 
Iccanobif(n)={1răsturnat(Iccanobif(n−1))+răsturnat(Iccanobif(n−2))dacă n=1 sau n=2 dacă n>2
Obținându-se astfel șirurile:
 
Fibonacci: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …
Iccanobif: 1, 1, 2, 3, 5, 8, 13, 39, 124, 514, 836, …
Iccanobif, se întreabă acum, ce număr are mai mulți divizori numere naturale: al n-lea termen din șirul Fibonacci sau al n-lea termen din șirul său.
 
 
Scrieți un program care să citească un număr natural '''n''' și să afișeze:
 
a) al n-lea termen din șirul lui Fibonacci și numărul său de divizori
b) al n-lea termen din șirul lui Iccanobif și numărul său de divizori
 
== Date de intrare ==
== Date de intrare ==
Programul citește de la tastatură numărul '''n'''.
Programul conține pe prima linie un număr natural '''p'''. Pentru toate testele de intrare, numărul '''p''' poate avea doar '''valoarea 1 sau valoarea 2'''. Pe linia a doua a fișierului se găsește un număr natural '''n'''.
 
== 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."
Dacă valoarea lui '''p este 1''', se va rezolva numai punctul a) din cerințe. În acest caz,programul va scrie al n-lea termen din șirul lui Fibonacci și numărul său de divizori.


Dacă datele sunt introduse corect, programul va rula.
Dacă valoarea lui '''p este 2''', se va rezolva numai punctul b) din cerințe. În acest caz, programul va scrie al n-lea termen din șirul lui Iccanobif și numărul său de divizori.


În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: ''' "Datele nu corespund restricțiilor impuse.".'''
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează cerintele de mai sus.
 
Î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''' ≤ 50
 
Pentru rezolvarea corectă a primei cerinţe se acordă 50% din punctaj, iar pentru cerința a doua se acordă 50% din punctaj.


== Exemplul 1 ==
== Exemplul 1 ==
; Intrare
; Datele de intrare
: 4
:Introduceti n:
; Ieșire
: 1
: Datele corespund cerințelor.
: 8
: 576
; Datele de ieșire
: Datele sunt introduse corect.
: Termenul 1 din sirul lui Fibonacci este 1 si are 1 divizori.
: Termenul 1 din sirul lui Iccanobif este 1 si are 1 divizori.
: Termenul 8 din sirul lui Fibonacci este 21 si are 4 divizori.  
: Termenul 8 din sirul lui Iccanobif este 39 si are 4 divizori.
<br>
<br>


== Exemplul 2 ==
; Datele de intrare
: Introduceti n:
: 2
: 9
; Datele de ieșire
: Datele sunt introduse corect.
: Termenul 2 din sirul lui Fibonacci este 1 si are 1 divizori.
: Termenul 2 din sirul lui Iccanobif este 1 si are 1 divizori.
:Termenul 9 din sirul lui Fibonacci este 34 si are 4 divizori.
:Termenul 9 din sirul lui Iccanobif este 124 si are 6 divizori.


<br>


== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#4273
#1956
def patrate_perfecte(n):
def rasturnat(n):
     patrate = []
     return int(str(n)[::-1])
    i = 1
    while len(patrate) < n:
        patrat = i * i
        patrate.append(patrat)
        i += 1
    return patrate


def numar_divizori(n):
    cnt = 0
    for i in range(1, n+1):
        if n % i == 0:
            cnt += 1
    return cnt


def calculeaza(numbers):
def fibonacci(n):
     product = 1
     if n <= 2:
    for number in numbers:
         return 1
         product *= number
     return fibonacci(n-1) + fibonacci(n-2)
     return product


def iccanobif(n):
    if n <= 2:
        return 1
    return rasturnat(iccanobif(n-1)) + rasturnat(iccanobif(n-2))


def validare_numar(n):
def validate_input(n):
     if n < 1 or n > 10:
     if not (1 <= n <= 50):
         return False
         return False
     return True
     return True


if __name__ == '__main__':
if __name__ == '__main__':
     n = int(input("Introduceți numărul n: "))
     n = int(input("Introduceti n: "))
     if not validare_numar(n):
     if not validate_input(n):
         print("Datele introduse nu corespund cerintelor.")
         print("Datele nu corespund restricțiilor impuse.")
     else:
     else:
         squares = patrate_perfecte(n)
         print("Datele sunt introduse corect.")
         product = calculeaza(squares)
         print("Termenul", n, "din sirul lui Fibonacci este", fibonacci(n), "si are", numar_divizori(fibonacci(n)), "divizori.")
        print("Datele introduse corespund cerintelor.")
         print("Termenul", n, "din sirul lui Iccanobif este", iccanobif(n), "si are", numar_divizori(iccanobif(n)), "divizori.")
         print(product)


</syntaxhighlight>


</syntaxhighlight>
'''Explicatie cod:'''
 
Această bucată de cod calculează termenii n din șirurile lui Fibonacci și Iccanobif și numărul lor de divizori, și adaugă o funcție de validare care verifică dacă input-ul este între 1 și 50.
 
Funcția rasturnat primește un număr și îl întoarce în ordine inversă, transformându-l întâi într-un șir de caractere și apoi folosind notarea cu pas negativ pentru a-l inversa.
 
Funcția numar_divizori calculează numărul de divizori ai unui număr, numărând toate divizorii între 1 și numărul dat și returnând numărul lor.
 
Funcția fibonacci calculează termenul n din șirul lui Fibonacci prin adunarea celor două termeni anterioare (sau 1, în cazul în care n este mai mic sau egal cu 2).
 
Funcția iccanobif calculează termenul n din șirul Iccanobif prin adunarea răsturnatei a două termeni anterioare (sau 1, în cazul în care n este mai mic sau egal cu 2).

Latest revision as of 07:05, 27 April 2023

Sursa: [1]

Cerinţa[edit | edit source]

Fibonacci, un celebru matematician italian din Evul Mediu, a descoperit un șir de numere naturale cu multiple aplicații, șir ce-i poartă numele:

Fibonacci(n)={1Fibonacci(n−1)+Fibonacci(n−2)dacă n=1 sau n=2 dacă n>2 Fascinat de șirul lui Fibonacci, și mai ales aplicațiile acestui șir în natură, Iccanobif, un matematician în devenire, a creat un șir si el un care-i poartă numele:

Iccanobif(n)={1răsturnat(Iccanobif(n−1))+răsturnat(Iccanobif(n−2))dacă n=1 sau n=2 dacă n>2 Obținându-se astfel șirurile:

Fibonacci: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … Iccanobif: 1, 1, 2, 3, 5, 8, 13, 39, 124, 514, 836, … Iccanobif, se întreabă acum, ce număr are mai mulți divizori numere naturale: al n-lea termen din șirul Fibonacci sau al n-lea termen din șirul său.


Scrieți un program care să citească un număr natural n și să afișeze:

a) al n-lea termen din șirul lui Fibonacci și numărul său de divizori b) al n-lea termen din șirul lui Iccanobif și numărul său de divizori

Date de intrare[edit | edit source]

Programul conține pe prima linie un număr natural p. Pentru toate testele de intrare, numărul p poate avea doar valoarea 1 sau valoarea 2. Pe linia a doua a fișierului se găsește un număr natural n.

Date de ieșire[edit | edit source]

Dacă valoarea lui p este 1, se va rezolva numai punctul a) din cerințe. În acest caz,programul va scrie al n-lea termen din șirul lui Fibonacci și numărul său de divizori.

Dacă valoarea lui p este 2, se va rezolva numai punctul b) din cerințe. În acest caz, programul va scrie al n-lea termen din șirul lui Iccanobif și numărul său de divizori.

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează cerintele de mai sus.

Î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 ≤ 50

Pentru rezolvarea corectă a primei cerinţe se acordă 50% din punctaj, iar pentru cerința a doua se acordă 50% din punctaj.

Exemplul 1[edit | edit source]

Datele de intrare
Introduceti n:
1
8
Datele de ieșire
Datele sunt introduse corect.
Termenul 1 din sirul lui Fibonacci este 1 si are 1 divizori.
Termenul 1 din sirul lui Iccanobif este 1 si are 1 divizori.
Termenul 8 din sirul lui Fibonacci este 21 si are 4 divizori.
Termenul 8 din sirul lui Iccanobif este 39 si are 4 divizori.


Exemplul 2[edit | edit source]

Datele de intrare
Introduceti n:
2
9
Datele de ieșire
Datele sunt introduse corect.
Termenul 2 din sirul lui Fibonacci este 1 si are 1 divizori.
Termenul 2 din sirul lui Iccanobif este 1 si are 1 divizori.
Termenul 9 din sirul lui Fibonacci este 34 si are 4 divizori.
Termenul 9 din sirul lui Iccanobif este 124 si are 6 divizori.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 1956

def rasturnat(n):

   return int(str(n)[::-1])

def numar_divizori(n):

   cnt = 0
   for i in range(1, n+1):
       if n % i == 0:
           cnt += 1
   return cnt

def fibonacci(n):

   if n <= 2:
       return 1
   return fibonacci(n-1) + fibonacci(n-2)

def iccanobif(n):

   if n <= 2:
       return 1
   return rasturnat(iccanobif(n-1)) + rasturnat(iccanobif(n-2))

def validate_input(n):

   if not (1 <= n <= 50):
       return False
   return True

if __name__ == '__main__':

   n = int(input("Introduceti n: "))
   if not validate_input(n):
       print("Datele nu corespund restricțiilor impuse.")
   else:
       print("Datele sunt introduse corect.")
       print("Termenul", n, "din sirul lui Fibonacci este", fibonacci(n), "si are", numar_divizori(fibonacci(n)), "divizori.")
       print("Termenul", n, "din sirul lui Iccanobif este", iccanobif(n), "si are", numar_divizori(iccanobif(n)), "divizori.")

</syntaxhighlight>

Explicatie cod:

Această bucată de cod calculează termenii n din șirurile lui Fibonacci și Iccanobif și numărul lor de divizori, și adaugă o funcție de validare care verifică dacă input-ul este între 1 și 50.

Funcția rasturnat primește un număr și îl întoarce în ordine inversă, transformându-l întâi într-un șir de caractere și apoi folosind notarea cu pas negativ pentru a-l inversa.

Funcția numar_divizori calculează numărul de divizori ai unui număr, numărând toate divizorii între 1 și numărul dat și returnând numărul lor.

Funcția fibonacci calculează termenul n din șirul lui Fibonacci prin adunarea celor două termeni anterioare (sau 1, în cazul în care n este mai mic sau egal cu 2).

Funcția iccanobif calculează termenul n din șirul Iccanobif prin adunarea răsturnatei a două termeni anterioare (sau 1, în cazul în care n este mai mic sau egal cu 2).