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++ 系列:交换两个数字的更多相关文章

  1. java交换两个数字位置

    第一种:在main输出,通过反射实现 1 public static void main(String[] args) throws Exception { Integer a = 1; Intege ...

  2. C#交换两个数字

  3. Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?

    从接触 Python 时起,我就觉得 Python 的元组解包(unpacking)挺有意思,非常简洁好用. 最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值: >>> ...

  4. 如何交换两个等长整形数组使其数组和的差最小(C和java实现)

    1. 问题描述: 有两个数组a,b,大小都为n,数组元素的值任意整形数,无序: 要求:通过交换a,b中的元素,使[数组a元素的和]与[数组b元素的和]之间的差最小. 2. 求解思路: 当前数组a和数组 ...

  5. 实现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 ...

  6. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

  7. C语言位操作--不用中间变量交换两数值

    1.使用加法与减法交换两数值: #define SWAP(a, b) ((&(a) == &(b)) || \ (((a) -= (b)), ((b) += (a)), ((a) = ...

  8. JS基础语法---练习:交换两个变量的值

    * JavaScript简称为JS * JavaScript是什么?     * 是一门脚本语言:不需要编译,直接运行     * 是一门解释性的语言:遇到一样代码就解释一行代码     * C#语言 ...

  9. JavaScript求两个数字之间所有数字的和

    这是在fcc上的中级算法中的第一题,拉出来的原因并不是因为有什么好说的,而是我刚看时以为是求两个数字的和, 很显然错了.我感觉自己的文字理解能力被严重鄙视了- -.故拉出来折腾折腾. 要求: 给你一个 ...

随机推荐

  1. JasperReport环境设置

    JasperReport是一个纯Java库,而不是一个独立的应用程序.它不能单独运行,因此它需要被嵌入到另一个客户端或服务器端的Java应用程序.因为它是基于Java,它可以在任何支持Java的平台( ...

  2. Quartz特点

    运行环境 Quartz 可以运行嵌入在另一个独立式应用程序 Quartz 可以在应用程序服务器(或servlet容器)内被实例化,并且参与XA事务 Quartz 可以作为一个独立的程序运行(其自己的J ...

  3. 远程服务器安装nginx

    肯定有前端的小伙伴在腾讯云或者阿里云上购买了服务器,却不知道怎么访问使用它,那我们就一起来安装学习下? xshell 登录服务器,输入公网ip和密码登录 ls 查看目录,which nginx ,查看 ...

  4. c# 使用NOPI 操作Excel

    最近项目需要导出Excel,找来找去,微软有自己的Excel组件 using Microsoft.Office.Core;using Microsoft.Office.Interop.Excel;,但 ...

  5. java并发之同步辅助类CountDownLatch

    CountDownLatch 含义: CountDownLatch可以理解为一个计数器在初始化时设置初始值,当一个线程需要等待某些操作先完成时,需要调用await()方法.这个方法让线程进入休眠状态直 ...

  6. Ubuntu下搭建NFS,并在开发板挂载

    ---恢复内容开始--- zai root huanjingxiachaozhuo $ su 一.搭建NFS 1.执行命令:sudo apt-get install nfs-kernel-server ...

  7. JS window对象取消计时器clearInterval() clearInterval() 方法可取消由 setInterval() 设置的交互时间。

    取消计时器clearInterval() clearInterval() 方法可取消由 setInterval() 设置的交互时间. 语法: clearInterval(id_of_setInterv ...

  8. 2变量与基本类型之const限定符

    一.const介绍: const对象一旦被创建其值就不能再改变,所以const对象必须初始化.任何试图对const赋值的行为都会引发错误. 二.初始化和const: 对const对象的主要限制就是只能 ...

  9. windows10,nodejs安装步骤

    系统: windows10 1.下载: https://nodejs.org/en/ 2.下载最新版本,根据你的系统选择32位或者64位: 3.建议选择源码源码安装,不选择编译后的安装 如: 4.进行 ...

  10. python中模块和包的概念

    1.模块 一个.py文件就是一个模块.这个文件的名字是:模块名.py.由此可见在python中,文件名和模块名的差别只是有没有后缀.有后缀是文件名,没有后缀是模块名. 每个文件(每个模块)都是一个独立 ...