Principiante · Lógica booleana

Año bisiesto

Lee un año y decide si es bisiesto. La regla suena fácil — «divisible por 4» — y entonces aparecen los siglos. Ejercicio perfecto de &&, || y leer el enunciado con lupa.

En una fraseImprime "leap year" si el año es divisible por 4 pero no por 100, o divisible por 400: 1900 no es bisiesto, 2000 sí, y ambos están en las pruebas ocultas.

El problema

Entrada: un entero año (1 ≤ año ≤ 3000).

Salida: leap year o not a leap year (exactamente estas palabras).

La regla: un año es bisiesto si es divisible por 4 y no por 100, o si es divisible por 400.

Ejemplos:

EntradaSalidaPor qué
2024leap yeardivisible por 4, no por 100
1900not a leap yeardivisible por 100 pero no por 400
2000leap yeardivisible por 400

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 — traduce la frase tal cual

«divisible por 4 y no por 100, o divisible por 400» se escribe (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0). Los paréntesis importan: && liga más que ||, pero los paréntesis explícitos se leen mejor.

Pista 2 — las pruebas que cazan soluciones perezosas

Una solución de solo «divisible por 4» pasa 2024 pero falla 1900 (debería ser no) y 2000 (debería ser sí). El juez incluye justamente esos años trampa — eso es probar los casos borde.

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

int main() {
    int y;
    cin >> y;
    bool leap = (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
    if (leap) cout << "leap year" << endl;
    else cout << "not a leap year" << endl;
    return 0;
}

Fíjate en que cout imprime un bool como 1/0 — por eso ramificamos en lugar de imprimirlo directo. Los condicionales y booleanos están en todas partes; El mayor de tres entrena el mismo músculo desde otro ángulo.

Análisis profundo

Por qué funciona

La regla es una cadena de excepciones: divisible por 4, salvo los siglos, salvo los múltiplos de 400. Es un examen de leer la especificación al pie de la letra.

El coste

O(1): como mucho tres operaciones de módulo.

Dónde falla

  • year % 4 == 0 a secas dice que 1900 es bisiesto. No lo es: 1900 % 100 == 0 y 1900 % 400 != 0.
  • a || b && c se agrupa como a || (b && c): && tiene más prioridad. Olvidar los paréntesis es el fallo clásico.

Siguiente paso

Más casos borde que hay que clavar: El mayor de tres.

Dos cosas para recordar

  • 1900 no es bisiesto; 2000 sí.
  • && tiene más prioridad que ||: pon paréntesis o te morderá.
🐞 Esta versión falla: ábrela y pruébala

Solo prueba % 4: 1900 se cuela

#include <iostream>
using namespace std;

int main() {
    int y;
    cin >> y;
    if (y % 4 == 0) cout << "leap year" << endl;
    else cout << "not a leap year" << endl;
    return 0;
}