1956 - Siruri 2

De la Universitas 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, 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

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

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

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

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

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