0555 - Overflow: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: ==Cerința== Lui Gigel i s-a cerut să scrie un program care realizează înmulțirea dintre două numere naturale. Pentru a-i da o provocare lui Gigel, profesorul îi dă ca date de intrare un set de perechi de numere naturale pentru care produsul poate depăși <span style=“color: red”> 2 64</span>. Gigel trebuie acum să-și modifice programul pentru ca să poată detecta cazurile speciale. ==Date de intrare== Programul citește de la tastatură numărul <span style=...)
 
Fără descriere a modificării
Linia 27: Linia 27:
==Rezolvare==
==Rezolvare==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def validate_input(n, a, b):
def validare(n):
    """
     if not (1 <= n <= 100_000):
    Verifică dacă numerele date sunt numere naturale și dacă se pot reprezenta pe 8 octeți.
         return False
    """
     return True
     if not isinstance(n, int) or not isinstance(a, int) or not isinstance(b, int):
         raise ValueError("Numerele trebuie să fie numere naturale.")
     if a > 18446744073709551615 or b > 18446744073709551615:
        raise ValueError("Valorile celor două numere trebuie să fie cuprinse între 0 și 18.446.744.073.709.551.615.")




def read_input():
def overflow(nr1, nr2):
    """
     return nr2 and nr1 > 18446744073709551615 // nr2
    Citește numărul n și cele n perechi de numere de la tastatură și verifică dacă datele sunt corecte.
    """
    n = int(input())
    result = []
    for i in range(n):
        a, b = map(int, input().split())
        validate_input(n, a, b)
        result.append((a, b))
     return result




def multiply(a, b):
def produs(nr1, nr2):
     """
     return nr1 * nr2
    Înmulțește cele două numere primite ca parametri și returnează rezultatul.
    """
    result = a * b
    if result > 18446744073709551615:
        return "Overflow!"
    return str(result)




def main():
def verificare(n):
     pairs = read_input()
     nr = []
     for a, b in pairs:
    for i in range(n):
         print(multiply(a, b))
        nr1, nr2 = map(int, input().split())
        nr.append((nr1, nr2))
     for i in range(n):
        if overflow(nr[i][0], nr[i][1]):
            print("Overflow!")
         else:
            print(produs(nr[i][0], nr[i][1]))




if __name__ == "__main__":
if __name__ == '__main__':
    main()
    n = int(input())
    if validare(n):
        print("Date de intrare valide")
        verificare(n)
    else:
        print("Date de intrare invalide")
</syntaxhighlight>
</syntaxhighlight>
==Explicatie==
Programul are trei funcții:
validate_input: verifică dacă cele trei numere date sunt numere naturale și dacă cele două numere din pereche pot fi reprezentate pe 8 octeți fără semn. Dacă una din condiții nu este îndeplinită, se aruncă o excepție cu mesajul corespunzător.
read_input: citește numărul n și cele n perechi de numere de la tastatură, apoi validează datele și le adaugă într-o listă. Funcția returnează lista cu perechile de numere.
multiply: primește două numere ca parametri, le înmulțește și verifică dacă rezultatul se poate reprezenta pe 8 octeți fără semn. Dacă rezultatul este mai mare, returnează mesajul "Overflow!", altfel returnează rezultatul ca șir de caractere.
Funcția main apelează read_input pentru a citi datele de intrare și multiply pentru a înmulți fiecare pereche de numere. Rezultatele sunt afișate pe ecran, fiecare pe câte o linie.

Versiunea de la data 26 aprilie 2023 16:21

Cerința

Lui Gigel i s-a cerut să scrie un program care realizează înmulțirea dintre două numere naturale. Pentru a-i da o provocare lui Gigel, profesorul îi dă ca date de intrare un set de perechi de numere naturale pentru care produsul poate depăși 2 64. Gigel trebuie acum să-și modifice programul pentru ca să poată detecta cazurile speciale.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi n perechi de numere naturale, care trebuie înmulțite.

Date de ieșire

Programul va afișa pe ecran rezultatele pentru cele n operații, fiecare pe câte o linie. Rezultatul operației este produsul celor două numere, dacă acesta se poate reprezenta pe 8 octeți fără semn, sau mesajul Overflow!, în caz contrar.

Restricții și precizări

1 ≤ n ≤ 100.000 pentru fiecare pereche, cele două numere se pot reprezenta pe 8 octeți, fără semn valorile care se pot reprezenta pe 8 octeți fără semn sunt cuprinse între 0 și 18.446.744.073.709.551.615

Exemplu:

Intrare 3 2147483647 2147483647 18446744073709551615 2 666013 1

Ieșire 4611686014132420609 Overflow! 666013

Rezolvare

def validare(n):
    if not (1 <= n <= 100_000):
        return False
    return True


def overflow(nr1, nr2):
    return nr2 and nr1 > 18446744073709551615 // nr2


def produs(nr1, nr2):
    return nr1 * nr2


def verificare(n):
    nr = []
    for i in range(n):
        nr1, nr2 = map(int, input().split())
        nr.append((nr1, nr2))
    for i in range(n):
        if overflow(nr[i][0], nr[i][1]):
            print("Overflow!")
        else:
            print(produs(nr[i][0], nr[i][1]))


if __name__ == '__main__':
    n = int(input())
    if validare(n):
        print("Date de intrare valide")
        verificare(n)
    else:
        print("Date de intrare invalide")