面试---不增加变量,交换两个数值变量的值
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;
同理,乘除。
结果:
利用加减法的方式,可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失,例如:
结果:
很明显,原来a的值在交换给b的过程中发生了精度损失。
乘除法更像是加减法向乘除运算的映射,它与加减法类似:可以处理整型和浮点型变量,但在处理浮点型变量时也存在精度损失问题。而且乘除法比加减法要多一条约束:b必不为0。
可能经验上的某种直觉告诉我们:加减法和乘除法可能会溢出,而且乘除的溢出会特别严重。其实不然,采用这两种方法都不会溢出。以加减法为例,第一步的加运算可能会造成溢出,但它所造成的溢出会在后边的减运算中被溢出回来。
二、异或
结果:
异或法可以完成对整型变量的交换,对于浮点型变量它无法完成交换!!!!!!!!!
异或写法有一个潜在的问题:
结果:
如果swap()函数的两个实参为指向同一数据对象的指针时,结果是错误的。
要想不增加变量,交换两个变量的值,可以做加减乘除运算。用对应的加减法或者乘除法都可以做到。举例: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()函数的两个实参为指向同一数据对象的指针时,结果是错误的。
相关文章推荐
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- C#常见算法面试题小结
- php 面试碰到过的问题 在此做下记录
- asp.net 面试+笔试题目第1/2页
- asp.net 面试 笔试题目[附答案]第1/3页
- 面试:(设计,架构)
- PHP中级面试经历
- 戴维营教育2015年iOS暑期班笔试面试基础考核题
- 程序员编程面试取胜的8个技巧
- PHP相关面试中最经常涉及的12个问题
- 面试时,你会问面试官哪些问题?
- asp.net面试中的四十一个经典题目
- 网络工程师面试常见问题
- 腾讯社招面试经历
- java基础面试题 - java基础(1)
- 2013阿里巴巴安全工程师实习生招聘笔试小结
- 工作流引擎面试记录及未来发展
- 3个CCIE对一个工程师的面试题
- 今天面试IBM CSDL
- 职场动态赢得面试机会的8个技巧