1862 - CntCifKRec

From Bitnami MediaWiki
Revision as of 18:01, 27 April 2023 by Cata (talk | contribs) (→‎Exemplu)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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

<syntaxhighlight lang="python"> 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.")

</syntaxhighlight>

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.