两个数交换

本文详细介绍两种常见的两数交换方法:一种是借助第三个变量的传统方法;另一种是不使用第三个变量的创新方法,包括亦或方法、加法方法和乘法方法。文章强调了各种方法的适用场景及注意事项,特别是亦或方法的高效性和加法、乘法方法的越界风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

“`

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值