当前位置:网站首页>【C语言系列】— 不创造第三个变量,实现两个数的交换
【C语言系列】— 不创造第三个变量,实现两个数的交换
2022-07-29 05:09:00 【甘城なつき】
꧁ 各位大佬们好!很荣幸能够得到您的访问,让我们一起在编程道路上任重道远!꧂
* 博客专栏:【C生万物】*
本篇内容简介:实现两个数的交换!
了解作者:励志成为一名编程大牛的学子,目前正在升大二的编程小白。
励志术语:编程道路的乏味,让我们一起学习变得有趣!
正文开始
文章目录
开篇
在之前的一道出自(品茗股份)的笔试题相信大家不是很陌生了吧,在这里我们来再次回想一次这道题的做法:
题目:交换两个int变量的值,不能使用第三个变量,即a=5,b=3,交换之后a=5,b=3;
对你没看错,题目就是这么简单明了,有陷阱吗?—我想是没有的,但是如果你是当时笔试的同学,我猜你也不一定做得出!哈~
假设思想
我们在这里做一个假设,假设没有中间不允许创造第三个变量的规矩(就这样想想,我的规矩就是我的规矩)
我想大多数同学都跟我一样,简单嘛,没有条件限制了,直接上手写一个交换函数,完成了这次漂亮的交换—so easy
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void Swap(int* x, int* y)//实现这个交换函数(用指针来接受)
{
int tmp = 0;//定义一个中间变量交换两个值
tmp =*x;
*x = *y;
*y = tmp;
}
int main()
{
int a = 5;//题目给定的变量值
int b = 3;
printf("exchange before a=%d b=%d\n", a, b);//交换之前的值打印一下
Swap(&a, &b);//写一个交换函数,将a,b的地址传递上去(注意传值是不能改变main函数内部的值的)
printf("exchange after a=%d b=%d\n", a, b);//交换之后的值进行打印
return 0;
}
呐,你要的运行结果!
OK!一个小小的交换函数就被我们搞定了–等等不是说不能创造第三变量嘛—是哦
接下来再跟着看-这里我们试着用加减法来做一下,能不能解决问题
加减法解题思路
(1):先将a与b相加之和的值赋值给a
(2):交换后的b计算方法:就是要得到原来的a嘛,就用相加之和的值减去b就行,此时的b就等于交换之前的a了
(3):交换后的a计算方法:用(1)中的相加之和减去(2)中的b,就得到交换之前的b了
举个实例来看:
这样是不是更加清楚一点了!(别废话了,赶紧写代码吧–额,好!~)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 5;
int b = 3;
printf("exchange before a=%d b=%d\n", a, b);//交换之前的值打印一下
a = a + b;
b = a - b;
a = a - b;
printf("exchange after a=%d b=%d\n", a, b);//交换之后的值进行打印
}
运行的结果也是一样的!
Ok!交换成功-搞定(啥,你要交接很大的数,还有负数,抱歉我这个代码可管不了了这么多哦,自己想办法改进)
好吧好吧,搞不定,那再给你介绍一种方法:
异或法
(1):都学过异或(^)这个操作符吧
就是其实每个数字都是由32个bite位组合而成
异或就是利用bite位 相同为0,相异为1
(2):多说无益,看思路:
首先将a,b的值异或到a上,
想得到交换后的b:就用异或好的a与之前的b异或,就得到之前的a了,(同理这样得交换后的a)
手撕bite位给你们看:
思路都懂了吧,上手写代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 5;
int b = 3;
printf("exchange before a=%d b=%d\n", a, b);//交换之前的值打印一下
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("exchange after a=%d b=%d\n", a, b);//交换之后的值进行打印
return 0;
}
运行结果也是一样的啦~ Ok 这样才是真正的搞定哦!
边栏推荐
- C language handwritten qq-ai version
- QML custom tabbar
- 抢先预约 | 阿里云无影云应用线上发布会预约开启
- Container security open source detection tool - veinmind (mirror backdoor, malicious samples, sensitive information, weak password, etc.)
- 冒泡排序 C语言
- Custom QML control: imagebutton
- 携手数字人、数字空间、XR平台,阿里云与伙伴共同建设“新视界”
- Xiaobai high salary shortcut Qt development game Snake
- 365天挑战LeetCode1000题——Day 035 每日一题 + 二分查找 13
- Thousands of databases, physical machines all over the country, JD logistics full volume cloud live record | interview with excellent technical team
猜你喜欢
More than 200 ISVs have settled in! The first anniversary of Alibaba cloud computing nest
C语言连连看秒杀辅助
Yangyonglin, vice president of Rushi Technology: when traditional industries encounter "digital space"
51万奖池邀你参战!第二届阿里云ECS CloudBuild开发者大赛来袭
研发效能|Kubernetes核心技术剖析和DevOps落地经验
抢先预约 | 阿里云无影云应用线上发布会预约开启
QT系列---安装
Adb常用命令列表
千人规模互联网公司研发效能成功之路
刷题狂魔—LeetCode之剑指offer58 - II. 左旋转字符串 详解
随机推荐
During the appointment, the 2022 JD cloud industrial integration new product launch was launched online
QT学习:使用JSON/XML等非ts文件实现多语言国际化
C language handwritten qq-ai version
In depth analysis of common cross end technology stacks of app
NVIDIA Zhou Xijian: the last mile from design to digital marketing
AI应用第一课:C语言支付宝刷脸登录
英伟达周锡健:设计到数字营销的最后一公里
WDDM学习
阿里云架构师梁旭:MES on 云盒,助力客户快速构建数字工厂
JD cloud and Forrester consulting released a hybrid cloud report that cloud Nativity has become a new engine driving industrial development
研发效能|Kubernetes核心技术剖析和DevOps落地经验
Adb常用命令列表
什么是_GLIBCXX_VISIBILITY(default)
自定义Qml控件:ImageButton
Unity3D - 物体太远看不见的问题
水一篇图的拓扑排序
[event preview] cloud development, efficient and intelligent - the second Alibaba cloud ECS cloudbuild developer competition is about to start
365天挑战LeetCode1000题——Day 035 每日一题 + 二分查找 13
时间复杂度和空间复杂度
How to get command parameters in Visual Basic.Net