您的位置:首页 > 职场人生

面试---不增加变量,交换两个数值变量的值

2015-09-22 11:04 507 查看
一、加减法

要想不增加变量,交换两个变量的值,可以做加减乘除运算。用对应的加减法或者乘除法都可以做到。举例:a=5;b=8。

加减: a=a+b=5+8=13;b=a-b=13-8=5;a=a-b=13-5=8;

a=a-b=5-8=-3;b=a+b=-3+8=5;a=b-a=5-(-3)=8;

同理,乘除。

#include <iostream>
using namespace std;

int main(void)
{

int a=8, b=5;
a = a + b;
b = a - b;
a = a - b;
cout<<a<<" "<<b<<endl;
return 0;
}


结果:

5 8

Process returned 0 (0x0)   execution time : 0.215 s
Press any key to continue.


利用加减法的方式,可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失,例如:

#include <iostream>
using namespace std;

int main(void)
{

float a=3.123456, b=1234567.000000;
a = a + b;
b = a - b;
a = a - b;
cout<<a<<" "<<b<<endl;
return 0;
}


结果:

1.23457e+006 3.125

Process returned 0 (0x0)   execution time : 0.330 s
Press any key to continue.


很明显,原来a的值在交换给b的过程中发生了精度损失。

乘除法更像是加减法向乘除运算的映射,它与加减法类似:可以处理整型和浮点型变量,但在处理浮点型变量时也存在精度损失问题。而且乘除法比加减法要多一条约束:b必不为0。

可能经验上的某种直觉告诉我们:加减法和乘除法可能会溢出,而且乘除的溢出会特别严重。其实不然,采用这两种方法都不会溢出。以加减法为例,第一步的加运算可能会造成溢出,但它所造成的溢出会在后边的减运算中被溢出回来。

二、异或

#include <iostream>
using namespace std;

int main(void)
{

int i=8, j=5;
i ^= j;  //a=a^b !!!!!!!!!!!!!
j ^= i;  //b=b^(a^b)=b^a^b=b^b^a=0^a=a !!!!!!!!!!!
i ^= j;  //a=(a^b)^a=a^b^a=a^a^b=0^b=b !!!!!!!!!!!
cout<<i<<" "<<j<<endl;
return 0;
}


结果:

5 8

Process returned 0 (0x0)   execution time : 0.170 s
Press any key to continue.


异或法可以完成对整型变量的交换,对于浮点型变量它无法完成交换!!!!!!!!!

异或写法有一个潜在的问题:

#include <iostream>
#include <stdio.h>
using namespace std;

void swap( int  * , int * );

int main( void )
{

int i = 5 , j = 10 ;

puts("交换前:");
printf("i = %d , j = %d \n" , i , j );

swap( & i , & j);

puts("交换后:");
printf("i = %d , j = %d \n" , i , j );

//自己和自己交换
puts("交换前:");
printf("i = %d\n" , i );

swap( & i , & i);

puts("交换后:");
printf("i = %d\n" , i );

return 0;
}

void swap( int  * p , int * q )
{
* p ^= * q ;
* q ^= * p ;
* p ^= * q ;
}


结果:

交换前:
i = 5 , j = 10
交换后:
i = 10 , j = 5
交换前:
i = 10
交换后:
i = 0

Process returned 0 (0x0)   execution time : 0.220 s
Press any key to continue.


如果swap()函数的两个实参为指向同一数据对象的指针时,结果是错误的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试