三种交换两数的方法

第一种:创建一个临时变量来交换数值

代码如下;

int main()
{

    int a, b;
    scanf("%d%d", &a, &b);
    printf("交换前a = %d,交换前b = %d\n",a, b);
    int tmp = a;
    a = b;
    b = tmp;
    printf("交换后a = %d,交换后b = %d\n",a, b);
    return 0;

}

第二种:利用加减法来交换

但是这里有一个弊端那就是 当两个数据都接近数据极限时再相加会导致溢出从而数据丢失

代码如下

int main()
{
	    int a, b;
		scanf("%d%d", &a, &b);
		printf("交换前a = %d,交换前b = %d\n",a, b);
		a = a + b;
		b = a - b;
		a = a - b;
		printf("交换后a = %d,交换后b = %d\n", a, b);
	return 0;
}

第三种 :利用异或^

异或交换可以解决溢出问题;

但好酒不可贪杯 想着以后都要异或来交换了 其实还有个限制 其操作数必须是整数;

且有运算量 ,创建临时变量的方法可不这效率高了;所以能创建就是创建嘛 规定不能创建 再用异或。

放代码之前先说说几个异或的运算性质

a^a=a;a^0=a;

其实异或就是看二进制位有没有区别通过位运算时 不同为1 相同为0 ;

还有一个性质就是

a^a^a^b=a^b;

相同的就相当于干掉 a干掉a还剩一个a;当然还有交换律 和结合律 ;

代码如下;

int main()
{
	int a, b;
	scanf("%d%d", &a, &b);
	printf("交换前a = %d,交换前b = %d\n",a, b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("交换后a = %d,交换后b = %d\n", a, b);
	return 0;
}

其中来帮你理解理解

a = a ^ b;
b = a ^ b;
a = a ^ b;

第一行  a = a ^ b;

第二行  b = a ^ b=a^b^b;b和b会同归与尽所以只剩了a;此时b==a;

第三行  a = a ^ b=a^b^a;a和a会同归与尽所以只剩了b;此时a==b;

至此完成交换

  到这里大家想想怎么才能不创建临时变量来完成让两个数相加呢?

  总结三种方法的效率 第一种是做好,第三种次之,第二种最后;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值