交换两个整数的几种思路
前言
在此篇博客中介绍了交换两个整数的几种方法,由此也可以引申出其他方法,用以拓宽思路。
一、基于创建变量的交换
#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中,该代码是基于按位异或的交换,不会出现溢出的问题。
总结
通过以上几种整形数据的交换,我们发现用数学方法会产生不必要的问题;而按位异或代码块不够清晰,实际过程中会更多的采用临时变量的方法,代码效率高、可读性较好。
但通过对不同方法的学习,对面试以及思路拓宽具有很好的效果。