Principiante · lógica

Valor absoluto

El valor absoluto tira el signo y conserva el tamaño. Si el número ya es no negativo no hay nada que hacer; si es negativo, se voltea. Dos casos, una rama — y el cero tiene que caer del lado correcto.

En una fraseSi <code>n &lt; 0</code>, escribe <code>-n</code>; si no, escribe <code>n</code>.

El problema

Entrada: Un entero n (−1000000 ≤ n ≤ 1000000).

Salida: El valor absoluto de n.

Ejemplos:

EntradaSalida
-77
33

El cero es un caso límite real: su valor absoluto es 0, no −0. Escribir la condición como n < 0 (en vez de n <= 0) deja el cero del lado inofensivo automáticamente.

Tu solución

main.cpp — tu solución
Entrada personalizada para «Ejecutar mi entrada»

La corrección corre en tu navegador contra pruebas ocultas. Un bucle infinito se corta a los 3 segundos — aun así, asegúrate de que todo bucle tenga salida. Tu código se guarda solo mientras escribes.

¿Atascado? Pistas

Pista 1 — Dos casos, no tres

Positivo y cero reciben el mismo trato (imprimir tal cual), así que colapsan en una rama. Solo el caso negativo es distinto. Escribir tres ramas es un instinto común y siempre sobra una.

Pista 2 — Negar es restar de cero

-n produce el valor opuesto sin tocar n. Si prefieres ser explícito, 0 - n es lo mismo. En ambos casos imprime el resultado — no lo guardes y lo imprimas después, son líneas de más.

Pista 3 — ¿Por qué no llamar a abs()?

Puedes — abs() de <cstdlib> funciona aquí. Pero este problema va de la rama, y escribirlo una vez a mano hace que la versión de tres líneas de la biblioteca deje de ser magia. Prueba ambas y confirma que coinciden.

Solución (¡inténtalo primero!)
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    if (n < 0) {
        cout << -n << endl;
    } else {
        cout << n << endl;
    }
    return 0;
}

El manejo de signos aparece en todas partes: restos negativos en Contar pares e impares, divisiones negativas en el artículo de división entera, distancias negativas en Días entre dos fechas. Familiarizarte pronto con la rama negativa sale rentable.

Análisis profundo

Por qué funciona

El valor absoluto es una definición de dos casos: los no negativos ya son su propia magnitud, los negativos necesitan el signo volteado. Solo el caso negativo requiere una rama, y -n calcula el cambio sin modificar n.

El coste

O(1) — una comparación, una negación.

Dónde falla

  • Usar n <= 0 en vez de n < 0. Sigue imprimiendo 0 para cero, pero la rama ahora afirma que cero es negativo — y si luego añades lógica por caso, el cero cae del lado equivocado.
  • Hacer n = -n y luego imprimir en ambas ramas, duplicando la salida. Imprime una vez al final.
  • Suponer que la respuesta cabe en int — aquí sí, porque el rango es simétrico. Para -2147483648 no; ese es el clásico desbordamiento de abs(INT_MIN).

Siguiente paso

El manejo de signos se vuelve más sutil con restos: Contar pares e impares y el artículo de división entera.

Dos cosas para recordar

  • Bastan dos casos: el negativo se voltea, el resto no.
  • Prefiere n < 0 a n <= 0 para que el cero quede del lado inofensivo.
🐞 Esta versión falla: ábrela y pruébala

Solo trata el caso negativo: la entrada no negativa no imprime nada

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    if (n < 0) {
        cout << -n << endl;
    }
    // bug: no else branch, so 0 and positives print nothing
    return 0;
}