1956 - Siruri 2

From Bitnami MediaWiki

Sursa: [1]

Cerinţa

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

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

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, programul va rula.

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

Restricţii şi precizări

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

Intrare
1
8
Ieșire
21 4


Exemplul 2

Intrare
2
9
Ieșire
124 6


Rezolvare

<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("n trebuie sa fie intre 1 si 50.")
   else:
       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).