0555 - Overflow
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 validate_input(n, a, b):
""" Verifică dacă numerele date sunt numere naturale și dacă se pot reprezenta pe 8 octeți. """ 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():
""" 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):
""" Î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():
pairs = read_input() for a, b in pairs: print(multiply(a, b))
if __name__ == "__main__":
main()
</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.