程序员面试金典——解题总结: 9.17中等难题 17.1编写一个函数,不用临时变量,直接交换两个数

来源:互联网 发布:sql server报价 编辑:程序博客网 时间:2024/05/23 19:56
#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,异或是: 110b = a^b;// 等同于 (a^b)^b = aa = 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;}

0 0
原创粉丝点击