当前位置:网站首页>【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 这样才是真正的搞定哦!
边栏推荐
- 2022数学建模竞赛暑期培训讲座——最优化方法:目标规划
- 365 day challenge leetcode1000 question - distance between bus stops on day 038 + time-based key value storage + array closest to the target value after transforming the array and + maximum value at t
- osgSimplegl3结合RenderDoc工具
- 携手数字人、数字空间、XR平台,阿里云与伙伴共同建设“新视界”
- vim编辑器使用
- 京东云分布式链路追踪在金融场景的最佳实践
- 递归的基本原理
- Live broadcast preview | how to save 30% labor cost and shorten 80% trademark processing cycle?
- QML定制TabBar
- 平行云CEO 李岩:CloudXR ,开启通往元宇宙的通道
猜你喜欢

C语言宏#define命令练习

抢先预约 | 阿里云无影云应用线上发布会预约开启

数千个数据库、遍布全国的物理机,京东物流全量上云实录 | 卓越技术团队访谈录

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

一维数组练习

Getting started with arfoundation tutorial 10- plane detection and placement

Alibaba cloud architect Liang Xu: MES on cloud box helps customers quickly build digital factories

In depth analysis of common cross end technology stacks of app

直播预告|如何节省30%人工成本,缩短80%商标办理周期?

365 day challenge leetcode 1000 questions - day 039 full binary tree inserter + find peak II + snapshot array
随机推荐
题解:在一个排序数组中查找元素第一个和最后一个的位置 (个人笔记)
Webrtc audio anti weak network technology (Part 2)
Unity3d - the object is too far away to see
数据泄漏、删除事件频发,企业应如何构建安全防线?
直播预告:京东云DevOps与JFrog制品库的融合
数组学习之入门简单题 两数之和
The latest tank battle 2022 full development notes-1
Visual Basic .Net 如何获取命令参数
365天挑战LeetCode1000题——Day 040 设计跳表 + 避免洪水泛滥 + 查找大小为 M 的最新分组 + 销售价值减少的颜色球
With frequent data leakage and deletion events, how should enterprises build a security defense line?
R & D efficiency | analysis of kubernetes' core technology and Devops' landing experience
CMake 设置vs启动运行环境路径
直播预告|如何节省30%人工成本,缩短80%商标办理周期?
C语言用指向指针的指针对n个整数排序
Xiaolu Inn - Trailer
C语言函数实现输出I love you
Vs code的安装步骤及环境配置
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
CMU15-213 Malloc Lab实验记录
Li Yan, CEO of parallel cloud: cloudxr, opens the channel to the metauniverse