1636 - Cifre 15

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Sursa: [1]


Cerința

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

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

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

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

Exemplu:

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

Explicație

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

Rezolvare

Rezolvare ver. 1

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.")

Rezolvare ver. 2

# 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()))

# 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()

# 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

# î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

# 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.")