1125 - Overflow 2: Difference between revisions
No edit summary |
|||
Line 1: | Line 1: | ||
== Cerința == | == 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ă: | 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 == | == Date de intrare == | ||
Line 22: | Line 21: | ||
: 2 2 63 2 62 | : 2 2 63 2 62 | ||
; Ieșire | ; 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 | : 9223372036854775808 | ||
: Overflow! | : Overflow! | ||
: 443573316169 | : 443573316169 | ||
: 13835058055282163712 | : 13835058055282163712 | ||
=== Explicație === | |||
2^64 = 18.446.744.073.709.551.616, care nu poate fi reprezentat pe 8 octeți. | |||
== Exemplul 2 == | == Exemplul 2 == | ||
Line 36: | Line 41: | ||
: 2 2 62 2 63 | : 2 2 62 2 63 | ||
; Ieșire | ; Ieșire | ||
: | : Datele de intrare corespund restricțiilor impuse | ||
: | : Datele de intrare NU corespund restricțiilor impuse | ||
== Rezolvare == | == Rezolvare == | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line> | ||
#1125 - Overflow2 | #1125 - Overflow2 | ||
def este_rezultat_valid(rezultat): | def este_rezultat_valid(rezultat): | ||
max_intreg_fara_semn_64 = 2 ** 64 - 1 | max_intreg_fara_semn_64 = 2 ** 64 - 1 | ||
Line 51: | Line 54: | ||
def sunt_date_intrare_valide(n, m, perechi): | def sunt_date_intrare_valide(n, m, perechi): | ||
if | 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): | for i in range(0, 2 * m, 2): | ||
a, b = perechi[i], perechi[i + 1] | a, b = perechi[i], perechi[i + 1] | ||
if not (0 <= a <= 18446744073709551615) or not (0 <= b <= 64) or (a + b == 0): | 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 | return True | ||
Line 78: | Line 84: | ||
else: | else: | ||
rezultate.append("Overflow!") | rezultate.append("Overflow!") | ||
return rezultate | return rezultate |
Latest revision as of 21:26, 10 December 2023
Cerința[edit | edit source]
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[edit | edit source]
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[edit | edit source]
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[edit | edit source]
- 1 ⩽ n*m ⩽ 1.000.000
- 0 ⩽ b ⩽ 64
- a+b ≠ 0
Exemplul 1[edit | edit source]
- 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[edit | edit source]
2^64 = 18.446.744.073.709.551.616, care nu poate fi reprezentat pe 8 octeți.
Exemplul 2[edit | edit source]
- 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[edit | edit source]
<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>