1125 - Overflow 2
Cerința
După ce Gigel a rezolvat problema anterioară ( #Overflow ), profesorul nu a fost foarte mulțumit de metoda sa. Așadar, i-a dat următoarea problemă: se dau n numere naturale. Să se afle dacă numerele pot fi reprezentate pe 8 octeți, fără semn.
Date de intrare
Programul citește de la tastatură numărul n. Pe următoarele n rânduri se vor afla numerele m, urmate de m perechi de numere a b, cu semnificația de mai sus.
Date de ieșire
Programul va afișa pe ecran pentru fiecare din cele n cazuri rezultatul dacă numărul se încadrează în tipuri de date de 8 octeți, sau Overflow! în caz contrar.
Restricții și precizări
- 1 ⩽ n*m ⩽ 1.000.000
- 0 ⩽ b ⩽ 64
- a+b ≠ 0
Exemplul 1
- Intrare
- 4
- 1 2 63
- 1 2 64
- 1 666013 2
- 2 2 63 2 62
- Ieșire
- Datele de intrare corespund restricțiilor impuse
- Datele de intrare corespund restricțiilor impuse
- Datele de intrare corespund restricțiilor impuse
- Datele de intrare corespund restricțiilor impuse
- 9223372036854775808
- Overflow!
- 443573316169
- 13835058055282163712
Explicație
2^64 = 18.446.744.073.709.551.616, care nu poate fi reprezentat pe 8 octeți.
Exemplul 2
- Intrare
- 4
- 1 0 0
- 1 2 64
- 1 666013 2
- 2 2 62 2 63
- Ieșire
- Datele de intrare corespund restricțiilor impuse
- Datele de intrare NU corespund restricțiilor impuse
Rezolvare
<syntaxhighlight lang="python" line>
- 1125 - Overflow2
def este_rezultat_valid(rezultat):
max_intreg_fara_semn_64 = 2 ** 64 - 1 return 0 <= rezultat <= max_intreg_fara_semn_64
def sunt_date_intrare_valide(n, m, perechi):
if 1 <= n * m <= 1000000: print("Datele de intrare corespund restricțiilor impuse") else: print("Datele de intrare NU corespund restricțiilor impuse") exit(0)
for i in range(0, 2 * m, 2): a, b = perechi[i], perechi[i + 1] if not (0 <= a <= 18446744073709551615) or not (0 <= b <= 64) or (a + b == 0): print("Datele de intrare NU corespund restricțiilor impuse") exit(0) return True
def calculeaza_suma(n, date):
rezultate = []
for i in range(n): m, *perechi = map(int, date[i])
if sunt_date_intrare_valide(n, m, perechi): suma_totala = 0 for j in range(0, 2 * m, 2): a, b = perechi[j], perechi[j + 1] suma_totala += a ** b
if este_rezultat_valid(suma_totala): rezultate.append(suma_totala) else: rezultate.append("Overflow!")
return rezultate
def main():
n = int(input()) date_intrare = [list(map(int, input().split())) for _ in range(n)]
rezultate = calculeaza_suma(n, date_intrare)
for rezultat in rezultate: print(rezultat)
if __name__ == "__main__":
main()
</syntaxhighlight>