Principiante · variables
Intercambiar dos números
Imprimir b y luego a no necesita intercambio — basta con dos cout en el otro orden. La versión interesante es intercambiarlos de verdad, y ahí es donde los principiantes pierden un valor.
En una fraseEscribe <code>b</code> y luego <code>a</code> en una línea. Si intercambias en variables, guarda antes un valor en un temporal.
El problema
Entrada: Dos enteros a y b (−1000 ≤ cada uno ≤ 1000), separados por un espacio.
Salida: b y luego a, separados por un solo espacio.
Ejemplos:
| Entrada | Salida |
|---|---|
3 5 | 5 3 |
-1 7 | 7 -1 |
Dos estrategias igual de correctas: imprimir en el otro orden (una línea, sin cambiar estado) o intercambiar de verdad con un temporal (tres líneas, y el hábito que necesitarás para ordenar). Ambas pasan — enseñan cosas distintas.
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 — La respuesta más simple
cout << b << " " << a << endl; — listo. Nada en el programa necesita intercambiarse; solo importa el orden de salida. Reconocer cuándo el estado no debe cambiar es una habilidad real.
Pista 2 — Por qué un intercambio real necesita una tercera variable
Prueba a = b; b = a; y ambos acaban con el valor viejo de b — la primera asignación ya destruyó a. El temporal guarda el valor de a antes de que la primera asignación lo pise: int t = a; a = b; b = t;. El orden y el temporal son ambos estructurales.
Pista 3 — Un cin puede leer dos
cin >> a >> b; lee ambos valores en una sentencia, separando por espacios. Verás esta forma abreviada en todas partes — cin >> a; cin >> b; es idéntico pero más ruidoso.
Solución (¡inténtalo primero!)
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int t = a;
a = b;
b = t;
cout << a << " " << b << endl;
return 0;
}
Ese intercambio de tres líneas es exactamente lo que Ordenamiento burbuja repite miles de veces, y lo que Fusionar intervalos debe hacer con cuidado entre dos arrays paralelos. Aprende el orden ahora y no te volverá a morder.
Análisis profundo
Por qué funciona
Si solo importa el orden de salida, escribir b y luego a está completo — no hay que cambiar estado. Si de verdad intercambias, la primera asignación destruye un valor, así que un temporal debe salvarlo: t = a; a = b; b = t;. El orden y el temporal son imprescindibles.
El coste
O(1) — una lectura y una línea de escritura, o tres asignaciones para un intercambio real.
Dónde falla
a = b; b = a;— ambas variables acaban con el valor viejo de b; el de a desaparece.- Intercambiar solo uno (
a = b;y parar) — la salida muestra el mismo número dos veces. - Suponer que existe
swap()— existe en<algorithm>, que este motor no ofrece. Tres líneas a mano siempre funcionan.
Siguiente paso
Las mismas tres líneas, repetidas en un bucle: Ordenamiento burbuja y Ordenar tres números.
Dos cosas para recordar
- Un intercambio real son tres asignaciones; el temporal protege el valor que estás a punto de pisar.
- Si solo importa el orden de salida, no intercambies: imprime en el otro orden.
🐞 Esta versión falla: ábrela y pruébala
a = b; b = a; — ambos acaban con el valor de b, a se pierde
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
a = b; // bug: a is overwritten before it is saved
b = a;
cout << a << " " << b << endl;
return 0;
}