【笔试题】不创建第三个变量,实现两数的交换(品茗笔试)
题目: 不创建第三个变量,实现两数的交换。
交换两个数,我们最先会想到开辟第三个变量,再进行交换。
//第三变量法
swap1(int* a,int* b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
但是,这样的会消耗内存,开辟临时变量。那么看看swap2不开辟第三个变量,采用加减法完成a、b两数的交换。但是这个方法有一个弊端:当a、b两个数都是非常大的数时 a+b 时可能就会造成溢出。
最好的解决的方法是采用异或法,这也是品茗当年的一道笔试题。在平时需要交换两数时推荐:第三变量法或者异或法。
#include <iostream>
using namespace std;
//加减法
void swap2(int* a,int* b)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
//异或法
void swap3(int* a,int* b)
{
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
int main()
{
int a,b;
while(cin>>a>>b)
{
//swap2(&a,&b);
swap3(&a,&b);
cout>>a>>b>>endl;
}
return 0;
}