入门 · 变量
交换两个数
先打 b 再打 a,根本不需要交换 —— 顺序换一下就行。真正有意思的版本是真的把两个值互换,而新手正是在这里丢掉一个值。
一句话答案一行里先输出 <code>b</code> 再输出 <code>a</code>。如果你选择在变量里真交换,先把其中一个值存进临时变量。
题目
输入: 两个整数 a 和 b(各自 −1000 ≤ ≤ 1000),空格分隔。
输出: b 和 a,单个空格分隔。
样例:
| 输入 | 输出 |
|---|---|
3 5 | 5 3 |
-1 7 | 7 -1 |
两种同样正确的策略:换个顺序打印(一行,不改状态),或者用临时变量真交换(三行,也是排序时必需的肌肉记忆)。两种都能过 —— 它们教的是不同的东西。
你的解答
「运行我的输入」用的自定义输入
判题在浏览器本地运行。死循环会在 3 秒后被自动中断 —— 但还是确保每个循环都有出口。代码随打随存。
卡住了?提示
提示 1 — 最简单的答案
cout << b << " " << a << endl; —— 完事。程序里没有任何东西需要被交换,只有输出顺序重要。能看出「状态其实不用改」是一项真本事。
提示 2 — 真交换为什么需要第三个变量
试 a = b; b = a;,两个变量最后都是 b 的旧值 —— 第一次赋值已经把 a 毁了。临时变量在第一次赋值覆盖 a 之前,先把 a 的值存起来:int t = a; a = b; b = t;。顺序和临时变量缺一不可。
提示 3 — 一个 cin 能读两个
cin >> a >> b; 一句话读两个值,按空白切分。这个简写你会到处看到 —— cin >> a; cin >> b; 完全等价,只是更啰嗦。
题解(先自己试试!)
#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;
}
那个三行的交换,正是 冒泡排序 要重复上千次的东西,也是 区间合并 里必须小心地跨两个平行数组做的事。现在把顺序练对,以后就不会再被咬。
深度解析
为什么这样做对
如果只有输出顺序重要,先打 b 再打 a 就完事了 —— 不需要改状态。如果你真的交换,第一次赋值就会毁掉一个值,所以必须先存进临时变量:t = a; a = b; b = t;。顺序和临时变量缺一不可。
代价
O(1) —— 一行读写,或者真交换的三次赋值。
常见错法
a = b; b = a;—— 两个变量最后都持有 b 的旧值,a 的值消失了。- 只换了一个(
a = b;就停下)—— 输出里同一个数出现两次。 - 以为有现成的
swap()——<algorithm>里有,但本引擎不提供。手写三行永远能用。
记住这两句
- 真交换是三次赋值;临时变量保护你即将覆盖掉的那个值。
- 如果只有输出顺序重要,根本不用交换 —— 换个顺序打印就行。
🐞 这段是错的 —— 点开,亲手让它挂一次
a = b; b = a; —— 两个都变成 b 的值,a 丢了
#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;
}