0797 - SubNumar

From Bitnami MediaWiki

Sursa: - SubNumar


Explicatie[edit | edit source]

Un număr natural x, format din exact două cifre, este numit sub-număr al unui număr natural y dacă cifrele lui x apar, în aceeași ordine, pe ranguri consecutive, în numărul y. Exemplu: 21 este sub-număr al lui 12145, al lui 213, al lui 21, dar nu și al lui 123 sau al lui 231.

Cerinţa[edit | edit source]

Fișierul de intrare subnumar.in conține cel mult 1.000.000 de numere naturale. Se cere să se afișeze în fișierul de ieșire subnumar.out, în ordine descrescătoare, sub-numerele care apar de cele mai multe ori în scrierea numerelor date.

Date de intrare[edit | edit source]

Fișierul de intrare subnumar.in conține cel mult 1.000.000 de numere naturale cu cel puțin 2 cifre, separate prin câte un spațiu, dispuse pe mai multe linii.

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.", iar apoi in fişierul de ieșire subnumar.out va conține pe prima linie valorile cerute, separate prin câte un spațiu. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".

Restricţii şi precizări[edit | edit source]

  • numerele din fișierul de intrare vor fi din intervalul [10, 1.000.000.000]

Exemple[edit | edit source]

Exemplul 1[edit | edit source]

subnumar.in
393 17775787 72194942 12121774
Ieșire
Datele sunt corecte.
subnumar.out
77 21

Exemplul 2[edit | edit source]

subnumar.in
14214 1241 1241 421 514 142312
Ieșire
Datele sunt corecte.
subnumar.out
14

Exemplul 3[edit | edit source]

subnumar.in
9 8 7 1
Ieșire
Datele nu sunt comform restricțiilor impuse.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 0797 SubNumar

def subnumar(vector):

   subnr = [0] * 100
   for i in range(len(vector)):
       element = vector[i]
       while element > 9:
           subnr[element % 100] += 1
           element //= 10
   max = 0
   f = open("subnumar.out", "w")
   for i in range(10, 99):
       element = subnr[i]
       if element > max:
           max = element
   for i in range(99, 9, -1):
       element = subnr[i]
       if element == max:
           f.write(str(i))
           f.write(" ")


def conform_restrictiilor():

   vector = list()
   vector_verificare = [0] * 1000
   with open('subnumar.in') as f:
       lines = f.readlines()
       for line in lines:
           for c in line.split():
               if c.isdigit() == True:
                   vector.append(int(c))
   if len(vector) > 1000000:
       print("Datele nu sunt comform restricțiilor impuse.")
       exit()
   for x in vector:
       if x < 10 or x > 1000000000:
           print("Datele nu sunt comform restricțiilor impuse.")
           exit()
   print("Datele sunt corecte.")
   return vector


if __name__ == '__main__':

   vector = conform_restrictiilor()
   subnumar(vector)


</syntaxhighlight>

Explicaţie cod[edit | edit source]

In functia conform_restrictiilor() se citesc datele din fisierul de intrare subnumar.in, se verifica daca sunt conform restricțiilor impuse, apoi se returneaza vectorul de numere.

In functia subnumar(vector) se parcurge vectorul de numere, iar pentru fiecare numar se calculeaza subsecventele de doua cifre. Aceste subsecvente se adauga la o lista subnr ce contine numarul de aparitii pentru fiecare subsecventa posibila (10-99). Se cauta apoi cea mai mare valoare din subnr, se afiseaza toate subsecventele care apar de atatea ori si se scriu in fisierul de iesire subnumar.out.

In cazul in care datele nu sunt conforme, se afiseaza un mesaj de eroare si programul se incheie.

In final, programul afiseaza cele mai frecvente doua cifre din subsecventele de doua cifre din numerele din vector.