交换两数字不借助中间变量

交换两数字不借助中间变量

方法一:加减法


1
2
3
a = a + b;
b = a - b;
a = a - b;

  • 缺点
    该方法在整数交换上可能会发生数据溢出,可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失

代码


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//方法一:加减法

void swap1(int &a, int &b)

{

printf("法一:%d\t%d\n",a,b);

a = a+b;

b = a-b;

a = a-b;

}

方法二:乘除法


1
2
3
a = a*b;
b = a/b;
a = a/b;

乘除法更像是加减法向乘除运算的映射,它与加减法类似:可以处理整型和浮点型变量,但在处理浮点型变量时也存在精度损失问题。而且乘除法比加减法要多一条约束:b必不为0。

加减法和乘除法可能会溢出,而且乘除的溢出会特别严重。其实不然,采用这两种方法都不会溢出。以加减法为例,第一步的加运算可能会造成溢出,但它所造成的溢出会在后边的减运算中被溢出回来。

代码


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//方法二:乘除法

void swap2(double &a, double &b)

{

printf("法二:%f\t%f\n",a,b);

a = a*b;

b = a/b;

a = a/b;

}

方法三:异或法


1
2
3
a = a^b;
b = a^b;
a = a^b;

异或法可以完成对整型变量的交换,对于浮点型变量它无法完成交换。因为异或的运算操作是位运算,只针对整形变量。

可以写成宏替换


1
#define swap(a,b) (a)^=(b)^=(a)^=(b)

代码


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//方法三:异或法

void swap3(int &a, int &b)

{

printf("法三:%d\t%d\n",a,b);

a = a^b;

b = a^b;

a = a^b;

}

完整测试代码


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 // swap_tow_value.cpp : Defines the entry point for the console application.

/*============================ */

/* 交换两个变量不需要中间变量 */

/*=============================*/

#include "stdafx.h"

#include<stdio.h>

//方法一:加减法

void swap1(int &a, int &b)

{

printf("法一:%d\t%d\n",a,b);

a = a+b;

b = a-b;

a = a-b;

}

//方法二:乘除法

void swap2(double &a, double &b)

{

printf("法二:%f\t%f\n",a,b);

a = a*b;

b = a/b;

a = a/b;

}

//方法三:异或法

void swap3(int &a, int &b)

{

printf("法三:%d\t%d\n",a,b);

a = a^b;

b = a^b;

a = a^b;

}

int main(int argc, char* argv[])

{

int num1 = 1;

int num2 = 2;



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
	swap1(num1,num2);

printf("%d\t%d\n",num1,num2);

double num3 = 3.0, num4 = 4.0;

swap2(num3,num4);

printf("%f\t%f\n",num3,num4);

swap3(num1,num2);

printf("%d\t%d\n",num1,num2);

return 0;

}

这里写图片描述

-------------本文结束感谢您的阅读-------------