一、题目描述
循环输入,每输入两个数 a a a 和 b b b,交换两者的值后输出 a a a 和 b b b。当没有任何输入时,结束程序。
二、解题思路
难度:🔴⚪⚪⚪⚪
- 这个题的核心是考察如何交换两个变量的值,不像 python,我们可以直接写出下面这样的代码就实现了变量的交换。
a, b = b, a
- 在C语言里,这个语法是错误的。
- 我们可以这么理解,你有两个杯子 a a a 和 b b b,两个杯子里都盛满了水,现在想把两个杯子里的水交换一下,那么第一个想到的方法是什么?
当然是再找来一个临时杯子:
1)先把 a a a 杯子的水倒进这个临时的杯子里;
2)再把 b b b 杯子的水倒进 a a a 杯子里;
3)最后把临时杯子里的水倒进 b b b 杯子;
- 这种就是临时变量法,那么当然,还有很多很多的方法,接下来就让我们来见识一下吧。

三、代码详解
1、正确解法1:引入临时变量
#include <stdio.h>
int main() {
int a, b, tmp;
while (scanf("%d %d", &a, &b) != EOF) {
tmp = a; // (1)
a = b; // (2)
b = tmp; // (3)
printf("%d %d\n", a, b);
}
return 0;
}
-
(
1
)
(1)
(1)
tmp = a;表示把 a a a 杯子的水倒进这个临时的杯子里; -
(
2
)
(2)
(2)
a = b;表示把 b b b 杯子的水倒进 a a a 杯子里; -
(
3
)
(3)
(3)
b = tmp;表示把临时杯子里的水倒进 b b b 杯子里; - 这三步,就实现了变量 a a a 和 b b b 的交换。
2、正确解法2:引入算术运算
#include <stdio.h>
int main() {
int a, b;
while (scanf("%d %d", &a, &b) != EOF) {
a = a + b; // (1)
b = a - b; // (2)
a = a - b; // (3)
printf("%d %d\n", a, b);
}
return 0;
}
-
(
1
)
(1)
(1)
a = a + b;执行完毕后,现在最新的a的值变成原先的a + b的值; -
(
2
)
(2)
(2)
b = a - b;执行完毕后,相当于b的值变成了a + b - b,即原先a的值; -
(
3
)
(3)
(3)
a = a - b;执行完毕后,相当于a的值变成了a + b - a,即原先b的值; - 从而实现了变量
a和b的交换。
3、正确解法3:引入异或运算
- 首先,介绍一下C语言中的
^符号,代表的是异或。 - 二进制的异或,就是两个数转换成二进制表示后,按照位进行以下运算:
| 左操作数 | 右操作数 | 异或结果 |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 1 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
- 也就是对于 0 和 1,相同的数异或为 0,不同的数异或为 1。
- 这样就有了三个比较清晰的性质:
- 1)两个相同的十进制数异或的结果一定位零。
- 2)任何一个数和 0 的异或结果一定是它本身。
- 3)异或运算满足结合律和交换律。
#include <stdio.h>
int main() {
int a, b;
while (scanf("%d %d", &a, &b) != EOF) {
a = a ^ b; // (1)
b = a ^ b; // (2)
a = a ^ b; // (3)
printf("%d %d\n", a, b);
}
return 0;
}
- 我们直接来看
(
1
)
(1)
(1) 和
(
2
)
(2)
(2) 这两句话,相当于
b等于a ^ b ^ b,根据异或的几个性质,我们知道,这时候的b的值已经变成原先a的值了。 - 而再来看最后一句话,相当于
a等于a ^ b ^ a,还是根据异或的几个性质,这时候,a的值已经变成了原先b的值。 - 从而实现了变量
a和b的交换。

4、正确解法4:奇淫技巧
- 当然,由于这个题目问的是交换变量后的输出,所以它是没办法知道我程序中是否真的进行了交换,所以可以干一些神奇的事情。比如这么写:
#include <stdio.h>
int main() {
int a, b;
while (scanf("%d %d", &a, &b) != EOF) {
printf("%d %d\n", b, a);
}
return 0;
}
- 你学废了吗 🤣?
四、推荐专栏
五、习题练习
| 序号 | 题目链接 | 难度 |
|---|---|---|
| 1 | 交换数字 | ★☆☆☆☆ |
本文介绍了在C语言中如何交换两个变量a和b的值,包括使用临时变量、算术运算、异或运算以及一种奇淫技巧的解法,并详细解析了每种方法的实现过程。

6328





