零、写在前面
目前本专栏正在进行优惠活动,在博主主页添加博主好友(好友位没有满的话),可以获取 付费专栏优惠券。
今天是学习 「 C语言 」 打卡的第三天,学习方式很简单,每天我会提供一篇文章供群成员阅读,阅读完本文,做完课后的 「习题练习 」 ,在 万人千题 社区对应的 「 打卡帖 」 下打卡,今天的任务就算完成了。
很多人问,打卡的时候提示需要填写一个 「 链接 」,可以不用理会,直接提交 「 打卡 」 二字。也可以填写自己对今天打卡的 「 心得和感悟 」,或者 「 解题报告 」。
因为大家都在学习,所以一旦遇到问题都可以在群里问,群成员能够做出更加快速的反馈,高效的达成学习的目的。学有余力的同学可以在 万人千题 社区发布每天练习的解题报告。
一、题目描述
循环输入,每输入两个数 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 | 交换数字 | ★☆☆☆☆ |