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. Java各版本的含义

    JavaSE(Java Standard Edition):标准版,定位在个人计算机上的应用.这个版本是Java平台的核心,它提供了非常丰富的API来开发一般个人计算机上的应用程序,包括用户界面接口A ...

  2. C++公有继承、私有继承以及友元

    公有继承: 基类的成员在派生类中维持原来的访问权限,基类的publice成员为派生类的public成员,基类的protected成员为派生类的protected成员,基类的private成员在派生类的 ...

  3. chrony实现局域网时间同步

    chrony基于cs架构实现,配置一台服务主机与其他客户主机即可 服务端 #yum install chrony --RHEL7默认已安装chrony,而没有安装ntpd. #systemctl st ...

  4. 无法CREATE UNIQUE INDEX;找到重复的关键字

  5. 原型对象(JS中的父类)

    原型 prototype 我们所创建的每一个函数,解析器都会向函数中添加 一个属性prototype ,这个属性对应的对象就是我们所谓的原型对象  判断函数中是否含有prototype属性,有则返回 ...

  6. windows 和 linux 多线程

    学习了几天多线程技术,做个总结,便于记忆. 一般 多线程传递参数 为 void*  所以会有一个强制转换过程  (int*) (void *)等,传递多个参数选择 结构体指针.为了避免多个线程访问数据 ...

  7. Spring:DataSource注入到dao

    Spring:DataSource注入到dao 使用DOS命令创建数据库(Mysql) CREATE DATABASE book DEFAULT CHARACTER SET utf8; CREATE ...

  8. Tomcat服务器优化(内存,并发连接数,缓存)

    a) 内存优化:主要是对Tomcat启动参数进行优化,我们可以在Tomcat启动脚本中修改它的最大内存数等等.b) 线程数优化:Tomcat的并发连接参数,主要在Tomcat配置文件中server.x ...

  9. centos WPS 字体安装

    首先下载字体,解压后将整个wps_symbol_fonts目录拷贝到/usr/share/fonts目录下,然后赋予可读可执行权限. 权限设置操作如下: cd /usr/share/fonts/ ch ...

  10. vue导出table内容至excel——转

    一:在项目中需要安装2个依赖项,如下命令: npm install --save file-saver xlsx 二:在vue文件中如下使用即可: <template> <div c ...