首页 > 其他分享 >进阶两数交换的方法论

进阶两数交换的方法论

时间:2023-12-16 21:32:20浏览次数:35  
标签:main 方法论 return 进阶 int 交换 printf include 方法

今天我们来看一个简单的问题,大家对交换两个数字有多少想法呢,先看看这个。

以下我们全都以1,2,为例。

#include <stdio.h>
void swap(int a,int b)
{
	int t;
	t=a;
	a=b;
	b=t;
}
int main()
{
	int a=1,b=2;
	swap(a,b);
	printf("a=%d b=%d\n",a,b);
	return 0;
}

请问这个代码会输出什么?很明显,这个函数并不能起到交换a,b的目的,主函数中的a,b的值并没有发生改变,我们要了解传值和传址的问题,所以它会这样。

a=1 b=2

--------------------------------
Process exited after 0.4186 seconds with return value 0
请按任意键继续. . .

那么该如何交换呢。

方法一:借助中间变量

#include<stdio.h>
int main()
{
	int a=1,b=2,t;
	t=a;
	a=b;
	b=t;
	printf("a=%d b=%d\n",a,b);
	return 0;
}

这种临时变量法是最简单和最常见的方法,它的使用领域非常广泛且常见。

方法二:函数

上面例子中的函数没有作用,那么该如何使用函数呢。

#include <stdio.h>
void swap(int *a,int *b)
{
	int t;
	t=*a;
	*a=*b;
	*b=t;
}
int main()
{
	int a=1,b=2;
	swap(&a,&b);
	printf("a=%d b=%d\n",a,b);
	return 0;
}

我们用变量地址,交换它们的地址即可以改变它们的值。

方法三:加减交换法

#include<stdio.h>
int main()
{
	int a=1,b=2;
	a=a+b;
	b=a-b;
	a=a-b;
	printf("a=%d b=%d\n",a,b);
	return 0;
}

这个方法处就是不需要中间变量,先使用a+b保存a的值,即b=a-b=a=b-b=a;达到交换的目的,缺点是a+b的结果可能越界。

方法四:乘除交换法

#include<stdio.h>
int main ()
{
	int a=1,b=2;
	a=a*b;
	b=a/b;
	a=a/b;
	printf("a=%d b=%d\n",a,b);
	return 0;
}

这里类似加减,只是了换成乘法和除法,但其缺点更明显,乘法越界的可能性更大。

方法五:异或交换法

#include<stdio.h>
int main()
{
	int a=1,b=2;
	a=a^b;
	b=a^b;
	a=a^b;
	printf("a=%d b=%d\n",a,b);
	return 0;
}

这里是二进制位运算的方法,异或的运算法则为相同为0,不同为1,利用异或可以轻松达到目的。

这种方法十分完美,没有越界问题等;建议掌握。

结果如下:

a=2 b=1

--------------------------------
Process exited after 0.4051 seconds with return value 0
请按任意键继续. . .

方法五:位移交换法

#include<stdio.h>
int main()
{
	int a=1,b=2;
	 a<<=16;				//a=a<<16;
	 a|=b;					//a=a|b;
	 b=a>>16;				
	 a=a&0xffff;
	printf("a=%d b=%d\n",a,b);
	return 0;
}

这里比较难理解,建议自己实际用草稿操作一遍理解,可以直观的体会到方法的效果。

原理是把原来的int类型的a的值拆分成高16位和低16位,相当于多了16位的暂存空间可以周转,缺点是如果a或者b超过了16位,这种方法就会出错。所以实际不建议大家使用。

最后,我们可以将这些方法包装成函数使用,统称方法二的函数法。

好了,就讲到这里吧,希望通过上述文章让大家对交换两变量值有重新的认识,感谢各位的耐心阅读!

标签:main,方法论,return,进阶,int,交换,printf,include,方法
From: https://blog.51cto.com/u_16425819/8854400

相关文章

  • 算法学习Day4两两交换,链表相交,环形链表
    Day4两两交换,链表相交,环形链表ByHQWQF2023/12/16笔记24.两两交换链表中的节点给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。解法:迭代法迭代法使用了虚拟头节点的技巧,迭代法代码class......
  • 24. 两两交换链表中的节点
    题目24.两两交换链表中的节点要求给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。解答迭代的思路就是考虑清楚下一个节点是什么,举个实际的例子来解释代码,1→2→3→4→null,首先我先确定了最后......
  • 【博主新书】《OpenCV应用开发:入门、进阶与工程化实践》
    写作初心OpenCV作为开源的计算机视觉框架已经有超过20年的发展历程,OpenCV4是OpenCV目前为止最重要的里程碑版本。OpenCV4不仅包含了传统图像处理、图像分析、特征提取等模块的各种主流算法算子,还包含了深度学习模型部署与加速支持模块,兼容支持多种硬件与操作系统。OpenCV开发的应用......
  • 某高端智慧电车企业:规范文件外发流程,实现文件交换精细管控
    1、客户介绍某高端智慧电车品牌,隶属于世界500强汽车集团,成立于2018年,该品牌充分整合其所属母公司的多年造车技术积淀和优势资源,构建以用户为中心的创新商业模式,致力于成为“中国高端新能源乘用车领导者”,打造用户型科技企业,为用户创造现代格调的美好生活。2、建设需求基于业务......
  • 如何理解十二要素方法论
    本文翻译自HowToUnderstandTwelve-FactorMethodologyInSpringBootApplications,原作者:OLEKSII。十二要素应用程序是构建现代可扩展应用程序架构所需的一系列原则。本篇文章将从SpringBoot应用的角度回顾这些原则。一、代码库应用程序在版本控制系统(如Git)中进......
  • 四、以太网交换基础
    一、以太网交换基础1.以太网协议介绍定义:以太网是当今现有局域网(LocalAreaNetwork,LAN)采用的最通用的通信协议标准,该标准定义了在局域网中采用的电缆类型和信号处理方法。以太网是建立在CSMA/CD(CarrierSenseMultipleAccess/CollisionDetection,载波监听多路访问/冲突......
  • 为什么说跨网数据安全交换系统 对高新技术企业是必要的?
    高新技术企业现已成为市场经济中不可或缺的重要力量,因其雄厚的技术实力、宽阔的发展前景以及卓越的创新能力成为推动经济发展的关键因素。对于高新技术企业而言,其数据资产尤其重要,研发数据、产品信息、客户资料等,数据成为企业发展立足之根本,可以说,没有数据,高新技术企业则无法发展......
  • 《程序员进阶心法》读书(二)
    《程序员进阶心法》读书(二)(一)主要是第一二篇的知识点,本文是剩余的第三四篇的知识点描述问题的模式问题的上下文问题的具体描述问题的解决思考和思路问题的解决方案和具体技术或办法问题解决后的留下的思考或者其他延伸的疑问个人体会:或许可以作为写一片技术......
  • 《程序员进阶心法》读书(一)
    《程序员进阶心法》读书(一)前段时间在why佬技术群里有童鞋介绍了《程序员进阶心法》这本书,后来去图书馆借书偶然又遇到了这本书,我本人也是一直在找一个突破技术的方法,遂借来读读,我是先粗读了一遍,后又细读了比较关心的章节,收获比较大,特此记录。在前言里作者提到:这是一本关于路径......
  • 变量a的数据和b的数据进行交换
    用第三方变量#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){ inta=3; intb=4; inttmp=0; printf("交换前a=%d\n",a); printf("交换前b=%d\n",b); tmp=a; a=b; b=tmp; printf("交换后a=%d\n",a); p......