【第03题】给定 a 和 b ,交换它们的值并输出 | 四种解法

100 篇文章 538 订阅 ¥999.99 ¥499.90
本文介绍了在C语言中如何交换两个变量a和b的值,包括使用临时变量、算术运算、异或运算以及一种奇淫技巧的解法,并详细解析了每种方法的实现过程。
摘要由CSDN通过智能技术生成

零、写在前面

  目前本专栏正在进行优惠活动,在博主主页添加博主好友(好友位没有满的话),可以获取 付费专栏优惠券
  今天是学习 「 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的值;
  • 从而实现了变量ab的交换。

3、正确解法3:引入异或运算

  • 首先,介绍一下C语言中的^符号,代表的是异或。
  • 二进制的异或,就是两个数转换成二进制表示后,按照位进行以下运算:
左操作数右操作数异或结果
000
110
011
101
  • 也就是对于 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的值。
  • 从而实现了变量ab的交换。

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;
}
  • 你学废了吗 🤣?

四、推荐专栏

🌌《算法零基础100讲》🌌

五、习题练习

序号题目链接难度
1交换数字★☆☆☆☆
👇🏻 关注公众号 观看 精彩学习视频👇🏻
  • 55
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 37
    评论
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英雄哪里出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值