当前位置:网站首页>【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语言 一级指针

Handwritten student management system

Unity3d - the object is too far away to see

NVIDIA Zhou Xijian: the last mile from design to digital marketing

C语言用指向指针的指针对n个整数排序

【赛事预告】云上开发,高效智能——第二届阿里云ECS CloudBuild开发者大赛即将启动

365天挑战LeetCode1000题——Day 036 二叉树剪枝 + 子数组和排序后的区间和 + 删除最短的子数组使剩余数组有序

Cmu15-213 malloc lab experiment record

CMU15-213 Malloc Lab实验记录

51万奖池邀你参战!第二届阿里云ECS CloudBuild开发者大赛来袭
随机推荐
Come on! See how Clickhouse, which has risen 16 places a year, can be implemented in jd.com
MySQL的基础概念+数据库系统结构+拓展延申+基础命令学习
小鲁客栈---预告篇
365天挑战LeetCode1000题——Day 040 设计跳表 + 避免洪水泛滥 + 查找大小为 M 的最新分组 + 销售价值减少的颜色球
WDDM学习
哈夫曼树以及哈夫曼编码在文件压缩上的应用
Best practices of JD cloud Distributed Link Tracking in financial scenarios
AiTalk创始人梁宇淇:镜像连接虚拟与现实的纽带
如视技术副总裁杨永林:当传统产业遇到“数字空间”
osg3.6.5编译freetype失败
递归的基本原理
题解:在一个排序数组中查找元素第一个和最后一个的位置 (个人笔记)
MFC集成qt验证及问题处理
365天挑战LeetCode1000题——Day 042 数组序号转换 + 相对名次 离散化处理
How mongodb inserts, deletes and updates documents
510000 prize pool invites you to fight! The second Alibaba cloud ECS cloudbuild developer competition is coming
C 语言手写 QQ-AI 版
分配内存:malloc()和free()
Xiaolu Inn - Trailer
C语言数组典型应用代码详细讲解—高手误入(逐步代码详解)