█████████ ████ ███░░░░░███ ░░███ ███ ░░░ ██████ ███████ ██████ ██████ ░███ ███░░███ ███░░███ ███░░███ ███░░███ ░███ ░███ ░███░███ ░███ ░███████ ░███ ░███ ░░███ ███░███ ░███░███ ░███ ░███░░░ ░███ ░███ ░░█████████ ░░██████ ░░████████░░██████ ░░██████ ░░░░░░░░░ ░░░░░░ ░░░░░░░░ ░░░░░░ ░░░░░░

0xe2 - Detectar overflow al sumar dos enteros de 64 bits

Un entero sin signo de 64 bits (unsigned 64-bit integer en inglés) es un número entero que es mayor o igual a 0 pero estrictamente menor a 264. Se llama así porque si un número está dentro de este rango entonces está garantizado que al escribir este número en sistema binario el resultado tendrá máximo 64 dígitos binarios.

X y Y son dos enteros sin signo de 64 bits.

Queremos sumar X y Y. Generalmente no hay ningún problema porque X+Y también cabe en un entero sin signo de 64 bits, pero en algunas situaciones X+Y es mayor o igual a 264 y por lo tanto el resultado no podría ser representado con sólo 64 bits. Cuando esto ocurre decimos que hay overflow (una palabra en inglés que significa "desbordamiento").

Escribe un programa que dados X y Y determina si podemos sumarlos sin overflow.

Entrada

La entrada contiene exactamente dos líneas con los números X y Y (en decimal). Está garantizado que tanto X como Y son mayores o iguales a 0 pero estrictamente menores a 264.

Salida

La salida debe tener exactamente una línea con una sola palabra:

  • Si ocurre overflow al sumar los dos números, la salida debe ser la palabra Overflow.
  • Si no ocurre overflow al sumar los dos números, la salida debe ser la palabra Safe.

Entrada de ejemplo 1

9223372036854775807
9223372036854775808

Salida de ejemplo 1

Safe

Explicación del ejemplo 1

En este caso X = 263-1 y Y = 263. Por lo tanto X + Y = (263-1) + (263) = (2*263)-1 = 264-1 que cabe en un entero sin signo de 64 bits. Sin embargo, ¡estamos al filo del peligro! Si cualquiera de los 2 números fuera tan solo una unidad más grande, habría overflow.

Entrada de ejemplo 2

9223372036854775808
9223372036854775808

Salida de ejemplo 2

Overflow

Explicación del ejemplo 2

En este caso tanto X como Y son X = Y = 263. Por lo tanto X + Y = (263) + (263) = 2*263 = 264 que no cabe en un entero sin signo de 64 bits.

Sugerencias

  • Es trivial resolver este problema usando enteros de precisión arbitraria como BigInteger en Java ó el soporte automático para enteros grandes en Python y Ruby. Te recomiendo resolver este problema en un lenguaje como C, C++, Go ó Java; de lo contrario no estás aprendiendo nada.

  • Hay varias soluciones, cada una más bonita que la anterior. ¿Cuál es la solución que puedes encontrar que usa menos memoria?

Envía tu solución

Necesitas iniciar sesión para enviar una solución.