1125 - Overflow 2: Difference between revisions

From Bitnami MediaWiki
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.
;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
<br>
 
=== 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
: Date de intrare invalide!
: Datele de intrare corespund restricțiilor impuse
: Overflow!
: Datele de intrare NU corespund restricțiilor impuse
: 443573316169
: 13835058055282163712
<br>


== 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 not (1 <= n * m <= 1000000):
     if 1 <= n * m <= 1000000:
         return False
        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):
             return False
             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!")
        else:
            rezultate.append("Date de intrare invalide!")


     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>

  1. 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>