1956 - Siruri 2

From Bitnami MediaWiki
Revision as of 07:05, 27 April 2023 by Sinn Erich (talk | contribs) (→‎Exemplul 2)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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