4001 - Min Max K 9

From Bitnami MediaWiki

Sursă: [1]

Cerinţa

Se citește o cifră k și apoi se citesc numere naturale distincte de la tastatură până la apariția lui zero. Afișați câte dintre numerele citite după k sunt cuprinse între cel mai mic și cel mai mare număr cu proprietatea că are ultima cifră egală cu k. Dacă niciunul dintre numerele citite nu are ultima cifră egală cu k, atunci se va afișa NU EXISTA.

Date de intrare

Programul citește de la tastatură numărul k și apoi numere naturale distincte. Citirea se încheie la introducerea valorii 0, care nu se prelucrează.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.",Programul afișează pe ecran numărul de numere citite între numărul minim și cel maxim (inclusiv acestea) cu proprietatea cerută. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".

Restricții și precizări

  • numerele citite aparțin intervalului [0,1.000.000] și sunt distincte (diferite două câte două).
  • 0<=k<=9.
  • în total se citesc cel mult 200000 de numere.

Exemple

Exemplu 1

Date de intrare
5 45 44 5505 7884 15 75 530 0
Date de iesire
3

Exemplu 2

Date de intrare
4
1 2 3 4
Date de iesire
Datele sunt corecte. Rezultat: 4

Exemplu 3

Date de intrare
3
76968635425 456 6
Date de iesire
Datele introduse nu corespund cerinței.

Rezolvare

<syntaxhighlight lang="python" line> def citeste_k():

   while True:
       try:
           k = int(input("Introduceti cifra k: "))
           if 0 <= k <= 9:
               print("Datele sunt corecte.")
               return k
           else:
               print("Datele nu sunt conform restricțiilor impuse.")
       except ValueError:
           print("Trebuie introduse doar numere intregi.")


def citeste_valori():

   numere = []
   while True:
       try:
           n = int(input("Introduceti un numar: "))
           if 0 <= n <= 1000000:
               numere.append(n)
               if n == 0:
                   break
           else:
               print("Datele nu sunt conform restricțiilor impuse.")
       except ValueError:
           print("Trebuie introduse doar valori cu mai putin de 9 cifre.")
   return numere


def numere_cu_ultima_cifra_k(numere, k):

   numere_cu_k = [nr for nr in numere if nr % 10 == k]
   if len(numere_cu_k) == 0:
       print("NU EXISTA")
   else:
       min_nr_cu_k = min(numere_cu_k)
       max_nr_cu_k = max(numere_cu_k)
       numere_intre = [nr for nr in numere if min_nr_cu_k <= nr <= max_nr_cu_k and nr % 10 == k]
       print(len(numere_intre))


if _name_ == '_main_':

   k = citeste_k()
   valori = citeste_valori()
   numere_cu_ultima_cifra_k(valori, k)

</syntaxhighlight>

Explicație

Acest cod are ca scop rezolvarea problemei de a număra câte dintre numerele citite după o cifră k sunt cuprinse între cel mai mic și cel mai mare număr cu proprietatea că are ultima cifră egală cu k. Programul citește de la tastatură cifra k și apoi numere naturale distincte până la apariția lui zero, stocate într-o listă. În funcția citeste_k(), cifra k este citită și verificată dacă este între 0 și 9. În caz contrar, se afișează un mesaj de eroare. În funcția citeste_valori(), numerele sunt citite și verificate dacă sunt între 0 și 1000000 și adăugate în listă. În cazul în care se introduce 0, citirea se încheie și nu se adaugă în listă. Dacă se introduce o valoare care nu respectă restricțiile, se afișează un mesaj de eroare.
În funcția numere_cu_ultima_cifra_k(), lista de numere este parcursă și se generează o altă listă care conține doar numerele cu ultima cifră egală cu cifra k. Dacă nu există niciun număr cu această proprietate, se afișează "NU EXISTA". Altfel, se găsesc cel mai mic și cel mai mare număr din lista numere_cu_k și se numără câte dintre numerele inițiale se încadrează între aceste valori și au ultima cifră egală cu k. Rezultatul este afișat la consolă.