2097 - Vistiernic: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: == Enunț == Împăratul Persiei, Seram dă de ştire în toată împărăția sa, că vrea să-şi aleagă vistiernic care să-i administreze averea. El precizează că visteria palatului are n încăperi numerotate cu numere naturale diferite de '''0'''. Suma de bani pe care o are în aceste încăperi este egală cu produsul numerelor cu care sunt numerotate încăperile visteriei. De asemenea împăratul dă de ştire că va alege pe acel supus vistiernic, care ştie să...)
 
 
(Nu s-au afișat 6 versiuni intermediare efectuate de alți 2 utilizatori)
Linia 12: Linia 12:
== Restricţii şi precizări ==
== Restricţii şi precizări ==
* 1 ⩽ n ⩽ 1000
* 1 ⩽ n ⩽ 1000
* 1 ⩽ numărul de pe uşă ⩽ 32767, pentru fiecare încăpere.
* 1 ⩽ numărul de pe uşă ⩽ 32767, pentru fiecare încăpere
===Exemplu ===
==Exemplu ==
; vistiernic.in
; vistiernic.in
: 4
: 4
Linia 20: Linia 20:
: Datele sunt introduse corect.
: Datele sunt introduse corect.
: 3
: 3
== Explicație ==
== Explicație ==
Averea împăratului este egală cu numărul dat de produsul '''8*225*64*15'''. Acest număr se termină în '''3''' zerouri.
Averea împăratului este egală cu numărul dat de produsul '''8*225*64*15'''. Acest număr se termină în '''3''' zerouri.
== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def count_zeros(n, nums):
# Această funcție validează datele de intrare conform restrițiilor date
def validare_date(n, nr):
    if n < 1 or n > 1000:
        return False
    for nr in nr:
        if nr < 1 or nr > 32767:
            return False
    return True
 
# Această funcție numără numărul de zerouri finale din produsul numerelor date
def numara_zerouri(n, nr):
     cnt2 = 0
     cnt2 = 0
     cnt5 = 0
     cnt5 = 0
     for i in range(n):
     for i in range(n):
         tmp = nums[i]
         tmp = nr[i]
         while tmp % 2 == 0:
         while tmp % 2 == 0:
             cnt2 += 1
             cnt2 += 1
Linia 37: Linia 48:
     return min(cnt2, cnt5)
     return min(cnt2, cnt5)


def validate_input(n, nums):
if __name__ == '__main__':
    if n < 1 or n > 1000:
        print("Datele nu corespund restricțiilor impuse.")
        return False
    for num in nums:
        if num < 1 or num > 32767:
            print("Datele nu corespund restricțiilor impuse.")
            return False
    print("Datele sunt introduse corect.")
    return True
 
def main():
     with open('vistiernic.in', 'r') as fin, open('vistiernic.out', 'w') as fout:
     with open('vistiernic.in', 'r') as fin, open('vistiernic.out', 'w') as fout:
         n = int(fin.readline().strip())
         n = int(fin.readline().strip()) # citirea numărului de numere și conversia la int
         nums = list(map(int, fin.readline().split()))
         nr = list(map(int, fin.readline().split())) # citirea listei de numere și conversia la listă de int-uri
         if validate_input(n, nums):
         if validare_date(n, nr): # validare date de intrare
             fout.write(str(count_zeros(n, nums)))
            fout.write("Datele sunt introduse corect.\n")
             fout.write(str(numara_zerouri(n, nr))) # calcularea și scrierea numărului de zerouri în fișierul de ieșire
        else:
            fout.write("Datele nu corespund restricțiilor impuse.") # scrierea mesajului de eroare în fișierul de ieșire


if __name__ == '__main__':
    main()


</syntaxhighlight>
</syntaxhighlight>
== Explicație rezolvare==
  Funcția count_zeros() primește n - numărul de încăperi și nums - o listă de n numere naturale. Calculează câte zerouri se termină în numărul reprezentând averea și returnează acest număr.
Funcția validate_input() primește aceleași argumente ca count_zeros() și validează restricțiile impuse asupra datelor de intrare. Dacă datele de intrare sunt valide, afișează un mesaj corespunzător și returnează True, altfel afișează un alt mesaj și returnează False.
Funcția main() citeste datele de intrare din fișierul vistiernic.in, validează datele de intrare utilizând funcția validate_input(), apoi calculează și scrie numărul de zerouri în fișierul vistiernic.out, utilizând funcția count_zeros().

Versiunea curentă din 9 aprilie 2023 19:37

Enunț

Împăratul Persiei, Seram dă de ştire în toată împărăția sa, că vrea să-şi aleagă vistiernic care să-i administreze averea. El precizează că visteria palatului are n încăperi numerotate cu numere naturale diferite de 0. Suma de bani pe care o are în aceste încăperi este egală cu produsul numerelor cu care sunt numerotate încăperile visteriei. De asemenea împăratul dă de ştire că va alege pe acel supus vistiernic, care ştie să calculeze în câte zerouri se termină numărul ce reprezintă averea sa.

Cerinţa

Scrieţi un program care determină numărul de zerouri în care se termină averea împăratului.

Date de intrare

De pe prima linie din fişierul de intrare vistiernic.in se citeşte un număr natural n, ce reprezintă numărul de încăperi ale visteriei. De pe linia următoare se citesc n numere naturale separate prin spaţii reprezentând numerele înscrise pe uşile încăperilor visteriei.

Date de ieșire

Dacă datele sunt introduse corect, în fișier se va afișa: "Datele sunt introduse corect.", apoi pe prima linie în fişierul vistiernic.out se va afişa un număr ce reprezintă numărul de zerouri în care se termină averea împăratului. În cazul în care datele nu respectă restricțiile, se va afișa în fișier: "Datele nu corespund restricțiilor impuse.".

Restricţii şi precizări

  • 1 ⩽ n ⩽ 1000
  • 1 ⩽ numărul de pe uşă ⩽ 32767, pentru fiecare încăpere

Exemplu

vistiernic.in
4
8 225 64 15
vistiernic.out
Datele sunt introduse corect.
3

Explicație

Averea împăratului este egală cu numărul dat de produsul 8*225*64*15. Acest număr se termină în 3 zerouri.

Rezolvare

# Această funcție validează datele de intrare conform restrițiilor date 
def validare_date(n, nr):
    if n < 1 or n > 1000:
        return False
    for nr in nr:
        if nr < 1 or nr > 32767:
            return False
    return True

# Această funcție numără numărul de zerouri finale din produsul numerelor date
def numara_zerouri(n, nr):
    cnt2 = 0
    cnt5 = 0
    for i in range(n):
        tmp = nr[i]
        while tmp % 2 == 0:
            cnt2 += 1
            tmp //= 2
        while tmp % 5 == 0:
            cnt5 += 1
            tmp //= 5
    return min(cnt2, cnt5)

if __name__ == '__main__':
    with open('vistiernic.in', 'r') as fin, open('vistiernic.out', 'w') as fout:
        n = int(fin.readline().strip()) # citirea numărului de numere și conversia la int
        nr = list(map(int, fin.readline().split())) # citirea listei de numere și conversia la listă de int-uri
        if validare_date(n, nr): # validare date de intrare
            fout.write("Datele sunt introduse corect.\n")
            fout.write(str(numara_zerouri(n, nr))) # calcularea și scrierea numărului de zerouri în fișierul de ieșire
        else:
            fout.write("Datele nu corespund restricțiilor impuse.") # scrierea mesajului de eroare în fișierul de ieșire