题目:交换变量
输入两个整数a和B,交换二者的值,然后输出。
样例输入:
824 16
样例输出:
16 824
方法一:三变量法
引入一个中间变量tmp作为交换时的临时存储,相信这也是大多数人的第一想法,代码如下:
#include<stdio.h>
int main() {
int a, b, tmp;
scanf("%d %d", &a. &b);
tmp = a;
a = b;
b = tmp;
printf("%d %d\n", a, b);
return 0;
}
这种方法易于大多数人理解和接受。
方法二:加法计算交换
这种方法不借助别的变量,首先将a的值赋为a + b,然后b的值通过a - b即可交换为原来a的值,a的值再通过a - b即可交换为原来b的值,便实现了题目要求交换了两个变量的值,代码如下:
#include<stdio.h>
int main() {
int a, b;
scanf("%d %d", &a. &b);
a = a + b;
b = a - b;
a = a - b;
printf("%d %d\n", a, b);
return 0;
}
这种方法表面上看是要比方法一减少了引入临时变量所新开辟的空间,是对方法一的优化,实则存在问题,因为涉及到了加法操作,当我们不知道输入a和b的范围时,执行a + b的操作可能会导致超出int存储的范围,从而计算结果出错,交换值失败,所以在不明确输入数据范围时,方法二并不优于方法一。
方法三:异或操作
异或操作实现交换两个数的值其实本质与方法二相同,只不过方法二依靠的是:
tmp = a + b;
a = tmp - b;
b = tmp - a;
异或操作的本质依靠的是:
tmp = a ^ b;
a = tmp ^ b;
b = tmp ^ a;
但是方法二和方法三都没有引入第三个变量,而是通过a和b之间运算巧妙的将tmp值保存在其中一个变量中,从而交换成功,异或操作交换两个数值的代码如下:
#include<stdio.h>
int main() {
int a, b;
scanf("%d %d", &a. &b);
a ^= b;
b ^= a;
a ^= b;
printf("%d %d\n", a, b);
return 0;
}
总结
当不引入更多变量时,推荐使用方法三;方法一虽然引用了第三变量,但是易于理解,此外如果是做程序竞赛的话,最简单实现本题的方法肯定是直接改一下a和b输出时的位置,但是这样本质上并没有做到交互了a和b的值,最多称之为控制输出吧,代码如下:
#include<stdio.h>
int main() {
int a, b;
scanf("%d %d", &a, &b);
printf("%d %d\n", b, a);
return 0;
}