0555 - Overflow

From Bitnami MediaWiki
Revision as of 16:21, 26 April 2023 by Paul Ungur (talk | contribs)

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

<syntaxhighlight lang="python" line> 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")

</syntaxhighlight>