两个数交换

xiaoxiao2021-03-01  20

1.借助第3个变量

int a = 1,b = 2,c; c = a; / * 保存 a */ a = b; b = c;

2.不使用第3个变量 2.1 亦或方法

int a = 1,b = 2; a = a ^ b; b = a ^ b ; /* a ^ b ^ b == a */ a = a ^ b ; /* a ^ b ^ a == b */

2.2 加法方法

int a = 1,b =2; a = a + b ; /* 有越界风险 */ b = a - b ; /* a + b -b == a */ a = a - b ; /* a + b -a == b */

2.3 乘法方法

int a = 1,b = 2; a = a * b ; /* 有越界风险 */ b = a / b ; /* a * b / b == a */ a = a / b ; /* a * b / a == b */

不使用第3个变量的方法注意要点: 1.加法方法与乘法方法有越界风险,当两个互换的数很大时相加或者相乘导致溢出。 2.使用后三种方法时不可与自己交换。 针对2:同一个数与自己交换,隐式的自我互换。见下面的例子:

/* 亦或方法 */ void exchange0(int *a,int *b) { *a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b; } /* 加法方法 */ void exchange1(int *a,int *b) { *a = *a + *b; *b = *a - *b; *a = *a - *b; } /* 乘法方法 */ void exchange2(int *a,int *b) { *a = *a * *b; *b = *a / *b; *a = *a / *b; }

不使用第3个变量的两个数交换,一定杜绝自我互换,修复后的代码

/* 亦或方法 */ void exchange0(int *a,int *b) { if(*a == *b) return; *a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b; } /* 加法方法 */ void exchange1(int *a,int *b) { if(*a == *b) return; *a = *a + *b; *b = *a - *b; *a = *a - *b; } /* 乘法方法 */ void exchange2(int *a,int *b) { if(*a == *b) return; *a = *a * *b; *b = *a / *b; *a = *a / *b; }

“`

总结: 两个数交换不使用其他变量推荐使用”亦或方法“,注意不可自己与自己交换。

转载请注明原文地址: https://www.6miu.com/read-3450165.html

最新回复(0)