1636 - Cifre 15

From Bitnami MediaWiki

Sursa: [1]


Cerința[edit | edit source]

Alin este un elev pasionat de înmulțirea numerelor. Știe că produsul a două sau mai multe numere naturale poate avea ultima cifră 0. Se dau n numere naturale nenule. Ajutați-l pe Alin să determine: a. numărul de cifre 0 de la sfârşitul produsului celor n numere; b. care este ultima cifră nenulă a acestui produs.

Date de intrare[edit | edit source]

De pe prima linie a fișierului cifre15.in se citește un număr natural n iar de pe următoarea linie din fișier se citesc n numere naturale nenule, separate prin câte un spaţiu.

Date de ieșire[edit | edit source]

Fișierul de ieșire cifre15.out conține o singură linie pe care vor fi scrise cele două valori determinate, separate printr-un singur spațiu.

Restricții și precizări[edit | edit source]

1 ≤ n ≤ 100 numerele de pe a doua linie a fișierului de intrare au cel mult 9 cifre.

Exemplu:[edit | edit source]

cifre15.in
3
50 12 18
cifre15.out
2 8

Explicație[edit | edit source]

50∙12∙18=10800, la finalul produsului sunt 2 cifre 0, iar ultima cifră nenulă este 8

Rezolvare[edit | edit source]

Rezolvare ver. 1[edit | edit source]

<syntaxhighlight lang="python" line>

def validare(nr_de_numere, numere):

   if nr_de_numere < 1 or nr_de_numere > 100:
       return False
   for numar in numere:
       if numar < 1 or numar > 10**9:
           return False
   return True

def inmultire_numere(numere):

   numar_zero = 0
   ultima_cifra_nenula = None
   produs = 1
   for numar in numere:
       produs *= numar
       while produs != 0 and produs % 10 == 0:
           numar_zero += 1
           produs //= 10
       if produs != 0:
           ultima_cifra_nenula = produs % 10
   return numar_zero, ultima_cifra_nenula

def afisare(numar_zero, ultima_cifra_nenula):

   with open("cifre15.out", "w") as f:
       f.write(str(numar_zero) + " " + str(ultima_cifra_nenula) + "\n")

if __name__ == "__main__":

   with open("cifre15.in") as f:
       nr_de_numere = int(f.readline().strip())
       numere = list(map(int, f.readline().split()))
   if not validare(nr_de_numere, numere):
       print("Eroare: Datele introduse nu sunt valide!")
       exit()
   rezultat = inmultire_numere(numere)
   afisare(*rezultat)
   print("Datele au fost introduse corect.")

</syntaxhighlight>

Rezolvare ver. 2[edit | edit source]

<syntaxhighlight lang="python" line>

  1. citirea datelor de intrare

with open("cifre15.in") as f:

   # se citește nr_de_numere, numărul de numere ce trebuie înmulțite
   nr_de_numere = int(f.readline().strip())
   # se citește lista de n numere
   numere = list(map(int, f.readline().split()))
  1. validarea datelor de intrare

if nr_de_numere < 1 or nr_de_numere > 100:

   print("Eroare: Numarul introdus nu respectă restricțiile problemei!")
   exit()

for numar in numere:

   if numar < 1 or numar > 10**9:
       print("Eroare: Unul dintre numere nu respectă restricțiile problemei!")
       exit()
  1. inițializarea variabilelor

numar_zero = 0 # numărul de cifre 0 de la sfârșitul produsului numerelor ultima_cifra_nenula = None # ultima cifră nenulă a produsului numerelor

  1. înmulțirea numerelor și determinarea ultimei cifre nenule

produs = 1 for numar in numere:

   produs *= numar
   # se elimină cifrele 0 de la sfârșitul produsului
   while produs != 0 and produs % 10 == 0:
       numar_zero += 1
       produs //= 10
   # se determină ultima cifră nenulă a produsului
   if produs != 0:
       ultima_cifra_nenula = produs % 10
  1. scrierea datelor de ieșire

with open("cifre15.out", "w") as f:

   f.write(str(numar_zero) + " " + str(ultima_cifra_nenula) + "\n")

print("Datele introduse sunt valide.")

</syntaxhighlight>