1862 - CntCifKRec

De la Universitas MediaWiki

Cerinţa

Să se scrie o funcție Python recursivă cu trei parametri n, k, c și întoarce prin parametrul c numărul de cifre ale lui n care sunt mai mari sau egale decât k.

Restricţii şi precizări

  • Numele funcției va fi cnt_cif
  • Funcția va avea trei parametri: n, k, c, cu semnificația de mai sus
  • 0 ⩽ n ⩽ 2.000.000.000
  • 0 ⩽ k ⩽ 9

Date de intrare

Programul citește de la tastatură numărul n și k.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele introduse sunt corecte.", apoi pe un rând nou un mesaj dat în funcție de valoarea returnată de funcția cnt_cif, reprezentând numărul cerut. În cazul în care n sau k depășește limitele date, se va afișa "Numarul introdus nu este valid.", iar dacă n sau k nu este întreg, se va afișa "Nu ati introdus un numar intreg."

Exemplu

Intrare
Introduceti n: 2750
Introduceti k: 4
Ieșire
Datele introduse sunt corecte.
Numarul de cifre mai mari sau egale cu 4 din numarul 2750 este: 2

Rezolvare

def validate_input(n, k):
    if not isinstance(n, int) or not isinstance(k, int):
        return False
    if not (0 <= n <= 2000000000) or not (0 <= k <= 9):
        return False
    return True

def cnt_cif(n, k, c):
    if n < 9:
        if n >= k:
            c[0] += 1
    else:
        cnt_cif(n // 10, k, c)
        if n % 10 >= k:
            c[0] += 1

if __name__ == "__main__":
    n = input("Introduceti n: ")
    k = input("Introduceti k: ")
    try:
        n = int(n)
        k = int(k)
        if validate_input(n, k):
            c = [0]  # lista pentru a putea modifica valoarea in interiorul functiei
            cnt_cif(n, k, c)
            print("Datele introduse sunt corecte.")
            print(f"Numarul de cifre mai mari sau egale cu {k} din numarul {n} este: {c[0]}")
        else:
            print("Numarul introdus nu este valid.")
    except ValueError:
        print("Nu ati introdus un numar intreg.")

Explicație

Funcția `validate_input(n, k)` verifică dacă cele două argumente primite sunt numere întregi și dacă se încadrează în limitele specificate în cerință. Dacă da, returnează `True`, altfel `False`.

Funcția `cnt_cif(n, k, c)` numără câte cifre din numărul `n` sunt mai mari sau egale cu `k`. Aceasta primește `n`, `k` și `c`, unde `c` este o listă care conține un singur element. Acest element va fi actualizat în interiorul funcției pentru a reflecta numărul de cifre din `n` care sunt mai mari sau egale cu `k`.

În funcția `cnt_cif`, numerele sunt parcurse prin recursivitate de la cifra unităților până la cifra cea mai semnificativă. În timp ce numerele sunt parcurse, elementul din lista `c` este actualizat în funcție de cifrele care sunt mai mari sau egale cu `k`.

În funcția principală `main`, se cere utilizatorului să introducă valorile `n` și `k`. Dacă valorile introduse sunt corecte, funcția `cnt_cif` este apelată pentru a număra cifrele mai mari sau egale cu `k` din `n`. Dacă valorile introduse nu sunt corecte, se afișează un mesaj de eroare.