Principiante · Condicionales
El mayor de tres
Lee tres enteros e imprime el mayor. Suena trivial — hasta que el juez te mete negativos, empates y todo-iguales. La lección está en los casos borde.
En una fraseLee tres enteros e imprime el mayor con if/else anidados o un máximo acumulado; las pruebas ocultas incluyen negativos, repetidos y los tres iguales, así que inicializar el máximo en 0 falla.
El problema
Entrada: una línea con tres enteros a, b, c.
Salida: el mayor de los tres.
Ejemplos:
| Entrada | Salida |
|---|---|
3 7 5 | 7 |
-1 -5 -3 | -1 |
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 — el patrón del máximo corrido
No compares los tres a la vez. Asume que el primero es el máximo: int m = a; y mejóralo: if (b > m) m = b; y if (c > m) m = c;. Dos comparaciones simples valen más que un enredo de if/else — y el mismo patrón escala al máximo de un array entero.
Pista 2 — por qué los negativos rompen soluciones ingenuas
Si empiezas con int m = 0;, la entrada -1 -5 -3 imprime 0 sin haber estado nunca en los datos. Inicializa siempre el máximo con un valor real de la entrada, nunca con una constante inventada.
Solución (¡inténtalo primero!)
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
int m = a;
if (b > m) m = b;
if (c > m) m = c;
cout << m << endl;
return 0;
}
Los empates y las entradas todo-iguales salen gratis — > conserva el máximo actual cuando hay empate. Es el mismo patrón del acumulador de la suma con bucle; siguiente: Contar dígitos.
Análisis profundo
Por qué funciona
Un máximo corrido (best = max(best, x)) escala a cualquier número de entradas; un árbol de if/else con tres ramas no. Prefiere la forma que generaliza.
El coste
O(1) en ambos casos: tres comparaciones. La diferencia de rendimiento es cero; la de mantenimiento no.
Dónde falla
if (a > b) if (a > c)falla con los empates y cuando a es el menor. Compara contra el máximo actual.- Inicializar
best = 0rompe con entradas todas negativas. Arranca con un valor real de la entrada.
Siguiente paso
La misma idea sobre todo un array: Máximo de un array.
Dos cosas para recordar
- El máximo corrido generaliza; el árbol de decisiones no.
- Un máximo se siembra con datos reales, nunca con 0.
🐞 Esta versión falla: ábrela y pruébala
El máximo arranca en 0: falla con todo negativo
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
int best = 0;
if (a > best) best = a;
if (b > best) best = b;
if (c > best) best = c;
cout << best << endl;
return 0;
}