#include <iostream>
#include <stdio.h>
using namespace std;
/*
问题:编写一个函数,不用临时变量,直接交换两个数。
分析:既然只提供两个数,那么只能通过这两个数的增加和减少来交换,缺少的临时变量必定通过这两个数本身起到了作用,
设两个数为a和b,那么原来交换有临时变量的写法是,
temp = a ,
a = b,
b = temp
不用临时变量,肯定就是a和b其中一个作为临时变量,不妨设为a , 如果a = b,就丢失a,不行,如果a = a也不行,那么可以用 a = a + b
a = a + b
b = a - b,此时b已经等于a
a = a - b,此时a等于b了
之所以不用 a = a * b
b = a / b,
a = a / b,是因为不能保证b不为0
输入:
3 5
输出:
5 3
书上解法:
关键:
1还可以用异或的方式:利用异或中相同两数异或结果为0,任意数和0异或结果为该数本身
a = a^b;//假设3或5,011 和 101,异或是: 110
b = a^b;// 等同于 (a^b)^b = a
a = a^b;//等同于 (a^b)^a = b
*/
void swap(int* ptrA , int* ptrB)
{
*ptrA = *ptrA + *ptrB;
*ptrB = *ptrA - *ptrB;
*ptrA = *ptrA - *ptrB;
}
//异或进行交换
void swapXOR(int* ptrA , int* ptrB)
{
*ptrA ^= *ptrB;
*ptrB ^= *ptrA;
*ptrA ^= *ptrB;
}
void process()
{
int a , b;
while(cin >> a >> b)
{
int tempA = a;
int tempB = b;
swap(&a , &b);
cout << a << " " << b << endl;
/*
swapXOR(&tempA , &tempB);
cout << tempA << " " << tempB << endl;
*/
}
}
int main(int argc , char* argv[])
{
process();
getchar();
return 0;
}