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上的中级算法中的第一题,拉出来的原因并不是因为有什么好说的,而是我刚看时以为是求两个数字的和, 很显然错了.我感觉自己的文字理解能力被严重鄙视了- -.故拉出来折腾折腾. 要求: 给你一个 ...
随机推荐
- centos7下jenkins升级
systemctl stop jenkins cd cd /usr/lib/jenkins/ mv jenkins.war jenkins.war.bac rz #上传下载好的最新jinkens.wa ...
- 时间同步服务器NTP搭建
NTP服务器 NTP(Network Time Protocol)[网络时间协议],它是用来同步网络中各个计算机的时间的协议,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒, ...
- 深入浅出原生JS:One
Arguments 对象: 在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们. 例如,在函数 sayHi() 中,第一个参数是 message.用 argumen ...
- 一、微服务概述与SpringCloud
一.微服务概述与SpringCloud 1.微服务与微服务架构 微服务强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题/提供落地对应服务的一个服务应用,狭意的看,可以看作Eclipse里面 ...
- 驾驶心率和呼吸,疲劳检测系统,通过安全带,坐垫等内置sensor
HARKEN - Heart and respiration in car embedded nonintrusive sensors 2 https://www.youtube.com/watch? ...
- 小程序学习三 一切的开始app() 小程序的注册
现在打开 app.js //app.js App({ onLaunch(options) { //小程序初始化 // console.log("小程序初始化", options) ...
- java-----Long转换为 int , string
int: 1.调用intValue()方法 long ll = 300000; int ii= new Long(ll).intValue(); 2.先把long转换成字符串String,然后在转行成 ...
- JUC 一 ConcurrentHashMap
java.util.concurrent ConcurrentHashMap是一个支持并发检索和并发更新的线程安全的HashMap(但不允许空key或value). JDK8以CAS+synchron ...
- HTML中的相对路径与绝对路径
路径 实际工作中,通常新建一个文件夹专门用于存放图像文件,这时再插入图像,就需要采用“路径”的方式来指定图像文件的位置. 路径可以分为: 相对路径和绝对路径 相对路径 图像文件和HTML文件位于同一文 ...
- Mac 精品软件
Snagit:Mac 平台下最优秀的屏幕截图软件,可以录制屏幕视频.截图以及对截图进行加工. Flux 4:强大易用的网页设计工具,不需要学习编程即可在一天内建成一个专业的网站 Jump Deskto ...