C++ 系列:交换两个数字
1. 创建中间变量
这是最快也是最简单的办法,例如:
#include<stdio.h>
int main()
{
int a=10;
int b=20;
int temp;
printf("交换前a,b的值为:\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
temp=a;
b=a;
a=temp;
printf("交换后a,b的值为:\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
return 0;
}
2.调用函数交换两个数的值
#include<stdio.h>
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
int main()
{
int a=10;
int b=20;
printf("交换前a,b的值分别为:\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
swap(&a,&b);
printf("交换后a,b的值分别为:\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
return 0;
}
3.用加减或乘除运算来交换
#include<stdio.h>
int main()
{
int a=10;
int b=20;
printf("交换前a,b的值分别为:\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
a=a+b; //a=a*b;
b=a-b; //b=a/b;
a=a-b; //a=a/b;
printf("交换前a,b的值分别为:\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
}
我这里写的是用加减法实现,很显然成功了,乘除法是类似的,大家可以自己试试。可以看到一来,省去了创建中间变量,看起来也不算复杂。
不过,这种方法可能会产生使数值溢出的问题。
所以这种方法是有缺陷的,那有没有类似的不溢出的方法呢? 答案是肯定的,有。下面就来看这种不溢出的方法。
4.用异或交换
#include<stdio.h>
int main()
{
int a=10;
int b=20;
printf("交换前a,b的值分别为:\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
a=a^b;
b=a^b;
a=a^b;
printf("交换前a,b的值分别为:\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
}
掌握这种方法,就要知道什么叫异或。异或:一般是针对二进制数来说的,它的规则就是如果两个二进制数不相同,则异或结果为1;否则,异或结果为0。
这种方法看着和第三种很类似,但却比它更严谨。为什么这么说,因为上面说了,加减乘除这种方法很能会产生溢出错误,而异或却完全不会。因为两个二进制数异或的结果只能是0或1,不会产生进位或借位,不会超出变量的表示范围。
5.用位运算交换
#include<stdio.h>
int main()
{
int a=10;
int b=20;
printf("交换前a,b的值分别为:\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
b = (__int64)((__int64)a << 32 | (a = b)) >> 32;
printf("交换前a,b的值分别为:\n");
printf("a=%d\n",a);
printf("b=%d\n",b);
return 0;
}
整个语句的意思:先把a强制转化为64位整型变量,然后把它左移32位后与(a=b)按位或,把整个结果再强制转换为64位整型变量,然后右移32位得到b的值。其实,求b的值没必要有|(a=b)这部分,但因为想同时把b的值赋给a,且把|(a=b)放在这儿不会影响到b最终的值,所以写成这样。这儿就采用移位的方法避免了用中间变量。
C++ 系列:交换两个数字的更多相关文章
- java交换两个数字位置
第一种:在main输出,通过反射实现 1 public static void main(String[] args) throws Exception { Integer a = 1; Intege ...
- C#交换两个数字
- Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?
从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用. 最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值: >>> ...
- 如何交换两个等长整形数组使其数组和的差最小(C和java实现)
1. 问题描述: 有两个数组a,b,大小都为n,数组元素的值任意整形数,无序: 要求:通过交换a,b中的元素,使[数组a元素的和]与[数组b元素的和]之间的差最小. 2. 求解思路: 当前数组a和数组 ...
- 实现pow(int x, int y),即x的y次方 ; 异或交换两个数;
问题1:实现pow(int x, int y) ,即x的y次方 x的y次方就是有y个x连续乘机,代码如下: #include <stdio.h> #include <stdlib.h ...
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全 Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...
- C语言位操作--不用中间变量交换两数值
1.使用加法与减法交换两数值: #define SWAP(a, b) ((&(a) == &(b)) || \ (((a) -= (b)), ((b) += (a)), ((a) = ...
- JS基础语法---练习:交换两个变量的值
* JavaScript简称为JS * JavaScript是什么? * 是一门脚本语言:不需要编译,直接运行 * 是一门解释性的语言:遇到一样代码就解释一行代码 * C#语言 ...
- JavaScript求两个数字之间所有数字的和
这是在fcc上的中级算法中的第一题,拉出来的原因并不是因为有什么好说的,而是我刚看时以为是求两个数字的和, 很显然错了.我感觉自己的文字理解能力被严重鄙视了- -.故拉出来折腾折腾. 要求: 给你一个 ...
随机推荐
- Apache配置 PHP 支持
1,在服务区安装PHP 解压 php 到纯英文路径目 2,添加 PHP处理模块 LoadModule php7_module C:/ProgramData/php/php7apache2_4.dl 3 ...
- hadoop命令行
持续更新中................ 1. 设置目录配额 命令:hadoop dfsadmin -setSpaceQuota 样例:hadoop dfsadmin -setSpaceQuota ...
- SingalR 构建 推送服务器初探
项目需要用到推送,于是重新研究了下推送框架,最好能够独立成一个服务,与业务无关的服务,可以给所有的项目通用.找了好久最终决定用SinglR 框架. Signal 是微软支持的一个运行在 Dot NET ...
- CentOS7.6编译安装Python-3.7.4
安装步骤 1. 下载安装包.wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz<说明>如果报SSL/TSL错误,则加 ...
- QTableView排序
1.由于是点击HeaderView进行排序,所以初始代码 //排序 //QTableView model->lgoods_model view->lgoods_view lgoods_he ...
- linux 定时执行sql
说明: 放执行脚本的路径是: /home/vagrant/ssh 文件夹结构: /home |_ vagrant |__ ssh |___ move_order_old_data.sh |___ mo ...
- Linux下安装.NETCore3.0
今天把.NETCore从2.2升到3.0记录一下 Download .NET Core 3.0 :https://dotnet.microsoft.com/download/dotnet-core/ ...
- Java判断链表是否为回文链表
请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 思路:1.通过快慢指针,来遍历链表 ...
- jenkins的安装和启用
1.下载Jenkins:下载地址:https://jenkins.io/zh/download/ 2.将Jenkins.war包上传到Tomcat的webapps目录下,本次的目录是/usr/loca ...
- python模块:typing
很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,加上Python本身就是一门弱类型的语言,这种现象就 ...