交换两个整数的值的4种方法-C语言

本文探讨了交换两个整数的不同策略,包括基于临时变量、数学加减乘除法、按位异或,以及它们各自的优缺点和适用场景。特别强调了数学方法可能遇到的溢出问题及按位异或的高效与清晰度问题。
摘要由CSDN通过智能技术生成

交换两个整数的几种思路



前言

在此篇博客中介绍了交换两个整数的几种方法,由此也可以引申出其他方法,用以拓宽思路。


一、基于创建变量的交换

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>

void swap(int *p1, int *p2) {
	int temp = 0;
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}
int main()
{
	int a = 0, b = 0;
	printf("请输入两个整数a、b用来交换:\n");
	scanf("%d %d", &a, &b);
	swap(&a, &b);
	printf("交换后的整数为a=%d、b=%d", a, b);
	return 0;
}

在这里插入图片描述
在swap函数中,该代码是利用创建第三变量进行两个整形的交换。

二、基于数学方法的交换

1.加法式交换

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>

void swap(int *p1, int *p2) {
	*p1 = *p1 + *p2;
	*p2 = *p1 - *p2;
	*p1 = *p1 - *p2;
}
int main()
{
	int a = 0, b = 0;
	printf("请输入两个整数a、b用来交换:\n");
	scanf("%d %d", &a, &b);
	swap(&a, &b);
	printf("交换后的整数为a=%d、b=%d", a, b);
	return 0;
}

在这里插入图片描述

在swap中,该代码是基于数学加减法式的交换。

2.乘除式交换

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>

void swap(int *p1, int *p2) {
	*p1 = *p1 * *p2;
	*p2 = *p1 / *p2;
	*p1 = *p1 / *p2;
}
int main()
{
	int a = 0, b = 0;
	printf("请输入两个整数a、b用来交换:\n");
	scanf("%d %d", &a, &b);
	swap(&a, &b);
	printf("交换后的整数为a=%d、b=%d", a, b);
	return 0;
}

在这里插入图片描述
在swap中,该代码是基于数学乘除法式的交换。

3.其他数学方法交换

除以上外,还能想到如乘方等一些复杂的数学方法,可以在不创造出第三变量的基础上进行两个整形数据间的交换。

4.问题

由于int大小为四字节,其带符号位的最大值为2,147,483,648,如若通过数学方法超过其值,会出现溢出的问题,实际使用过程中受到一定的限制。

三、基于按位异或的方法

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>

void swap(int *p1, int *p2) {
	*p1 = *p1 ^ *p2;
	*p2 = *p1 ^ *p2;
	*p1 = *p1 ^ *p2;
}
int main()
{
	int a = 0, b = 0;
	printf("请输入两个整数a、b用来交换:\n");
	scanf("%d %d", &a, &b);
	swap(&a, &b);
	printf("交换后的整数为a=%d、b=%d", a, b);
	return 0;
}

在这里插入图片描述

在swap中,该代码是基于按位异或的交换,不会出现溢出的问题。


总结

通过以上几种整形数据的交换,我们发现用数学方法会产生不必要的问题;而按位异或代码块不够清晰,实际过程中会更多的采用临时变量的方法,代码效率高、可读性较好。
但通过对不同方法的学习,对面试以及思路拓宽具有很好的效果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值