0424 - Fibonacci generalizat

De la Universitas MediaWiki

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