栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

面试题-(不创造第三个变量,实现两个数的交换)-C语言

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

面试题-(不创造第三个变量,实现两个数的交换)-C语言

开篇:在之前的一道出自(品茗股份)的笔试题相信大家不是很陌生了吧,在这里我们来再次回想一次这道题的做法:
题目:交换两个int变量的值,不能使用第三个变量,即a=5,b=3,交换之后a=5,b=3;
对你没看错,题目就是这么简单明了,有陷阱吗?—我想是没有的,但是如果你是当时笔试的同学,我猜你也不一定做得出!哈~
假设思想:我们在这里做一个假设,假设没有中间不允许创造第三个变量的规矩(就这样想想,我的规矩就是我的规矩)
我想大多数同学都跟我一样,简单嘛,没有条件限制了,直接上手写一个交换函数,完成了这次漂亮的交换—so easy

#define _CRT_SECURE_NO_WARNINGS 1
#include
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=%dn", a, b);//交换之前的值打印一下
	Swap(&a, &b);//写一个交换函数,将a,b的地址传递上去(注意传值是不能改变main函数内部的值的)
	printf("exchange after a=%d b=%dn", 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
int main()
{
	int a = 5;
	int b = 3;
	printf("exchange before a=%d b=%dn", a, b);//交换之前的值打印一下
	a = a + b;
	b = a - b;
	a = a - b;
	printf("exchange after a=%d b=%dn", 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
int main()
{
	int a = 5;
	int b = 3;
	printf("exchange before a=%d b=%dn", a, b);//交换之前的值打印一下
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("exchange after a=%d b=%dn", a, b);//交换之后的值进行打印
	return 0;
}

 运行结果也是一样的啦~ Ok 这样才是真正的搞定哦!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/743654.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号