0424 - Fibonacci generalizat

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Context

Se consideră şirul Fibonacci generalizat, definit astfel: f1=a, f2=b, fk=fk-1+fk-2, dacă k > 2, unde a, b ∈ ℤ.

Cerinţa

Se dă un număr natural termen_maxim și două numere întregi termen1 și termen2. Să se afişeze în ordine termenii şirului lui Fibonacci generalizat cu valoarea absolută mai mică sau egală cu termen_maxim.

Date de intrare

Programul citește de la tastatură numerele termen1, termen2 si termen_maxim.

Date de ieșire

Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse.", urmat, pe rândul următor, programul afișează pe ecran termenii determinați, separați prin câte o virgulă și un spaţiu. În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, programul va afișa "Datele de intrare nu corespund restricțiilor impuse.".

Restricţii şi precizări

  • numar_elemente ∈ ℕ
  • 1 ⩽ termen_maxim ⩽ 500.000.000
  • termenii se vor afișa în ordinea: f1, f2, f3, ...

Exemplu

Intrare
-1
2
40
Ieșire
Datele introduse corespund restricțiilor impuse.
-1, 2, 1, 3, 4, 7, 11, 18, 29


Intrare
3
5
abc
Ieșire
Datele introduse nu corespund restricțiilor impuse.


Intrare
0
0
0
Ieșire
Datele introduse nu corespund restricțiilor impuse.


Rezolvare

Rezolvare ver. 1

# 0424 - Fibonacci Generalizat

def validare_date_termen_maxim(numar):
    if numar.isdigit():
        if 1 <= int(numar) <= 500_000_000:
            return True
        else:
            return False
    else:
        return False
    
    
def validare_date_termeni(termen1, termen2):
    all_int = True
    if not isinstance(termen1, str) and not isinstance(termen2, str):
        all_int = False
    else:
        try:
            int(termen1)
            int(termen2)
        except ValueError:
            all_int = False
    
    return all_int
    
    
def fibonacci_generalizat(termen1, termen2, termen_maxim):
    fibo1 = termen1
    fibo2 = termen2
    fibo3 = fibo1 + fibo2
    
    if termen_maxim >= 1:
        print(fibo1, fibo2, sep=", ", end=", ")
        while(abs(fibo3) < termen_maxim):  
            fibo1, fibo2 = fibo2, fibo3  
            if fibo1 + fibo2 > termen_maxim:
                print(fibo3)
            else:
                print(fibo3, end=", ")
            fibo3 = fibo2 + fibo1
    
        
if __name__ == "__main__":
    termen1 = input()
    termen2 = input()
    termen_maxim = input()
    
    if validare_date_termeni(termen1, termen2):
        termen1, termen2 = int(termen1), int(termen2)
        if validare_date_termen_maxim(termen_maxim):
            termen_maxim = int(termen_maxim)
            print("Datele de intrare corespund restricțiilor impuse.")
            fibonacci_generalizat(termen1, termen2, termen_maxim)
        else:
            print("Datele de intrare nu corespund restricțiilor impuse.")
    else:
        print("Datele de intrare nu corespund restricțiilor impuse.")