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:

EntradaSalida
3 7 57
-1 -5 -3-1

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 — 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 = 0 rompe 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;
}