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:
| Entrada | Salida | Por qué |
|---|---|---|
2024 | leap year | divisible por 4, no por 100 |
1900 | not a leap year | divisible por 100 pero no por 400 |
2000 | leap year | divisible por 400 |
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 == 0a secas dice que 1900 es bisiesto. No lo es: 1900 % 100 == 0 y 1900 % 400 != 0.a || b && cse agrupa comoa || (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;
}