当前位置:网站首页>【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 这样才是真正的搞定哦!
边栏推荐
- Xiaolu Inn - Trailer
- Unity3d - the object is too far away to see
- Come on! See how Clickhouse, which has risen 16 places a year, can be implemented in jd.com
- osg3.6.5编译freetype失败
- Li Yan, CEO of parallel cloud: cloudxr, opens the channel to the metauniverse
- MySQL的详细安装使用教程(保姆式安装图文讲解)
- C how to realize simple factory mode
- Live broadcast preview | how to improve enterprise immunity through "intelligent edge security"?
- 51万奖池邀你参战!第二届阿里云ECS CloudBuild开发者大赛来袭
- Qt版的贪食蛇游戏项目
猜你喜欢

vim编辑器使用

手写学生管理系统

Complete ecological map of R & D Efficiency & selection of Devops tools

The road to success in R & D efficiency of 1000 person Internet companies

Come on! See how Clickhouse, which has risen 16 places a year, can be implemented in jd.com

365 day challenge leetcode 1000 questions - day 037 elements and the maximum side length of squares less than or equal to the threshold + the number of subsequences that meet the conditions

More than 200 ISVs have settled in! The first anniversary of Alibaba cloud computing nest

Qml类型:MouseArea

365 day challenge leetcode 1000 questions - day 040 design jump table + avoid flooding + find the latest grouping with size M + color ball with reduced sales value

C语言连连看秒杀辅助
随机推荐
Live broadcast Preview: integration of JD cloud Devops and jfrog product library
The latest tank battle 2022 - full development notes-3
WDDM学习
CryEngine5 Shader调试
[event preview] cloud development, efficient and intelligent - the second Alibaba cloud ECS cloudbuild developer competition is about to start
Li Yan, CEO of parallel cloud: cloudxr, opens the channel to the metauniverse
MySQL的基础概念+数据库系统结构+拓展延申+基础命令学习
预约中,2022京东云产业融合新品发布会线上开启
The latest tank battle 2022 full development notes-1
C language handwritten qq-ai version
Unity3D - 物体太远看不见的问题
Qt版的贪食蛇游戏项目
容器安全开源检测工具--问脉 VeinMind(镜像后门、恶意样本、敏感信息、弱口令等)
C语言 一维数组
GPIO的输入输出详解
来!看排名一年上升16位的ClickHouse,如何在京东落地实践
QtCreator+CMake编译器设置
CSDN的md编辑器如何输入上下标?公式和非公式的输入方式不一样
EXIT中断详解
Rimworld通过SteamCMD上传创意工坊的方法