1636 - Cifre 15

De la Universitas MediaWiki

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