【编程题】不引入第三个变量,而交换两个变量的值

不引入第三个变量,而交换两个变量的值

方法一:算术运算

1 int a,b;
2 a=10;b=12;
3 a=b-a;    //a=2;b=12
4 b=b-a;    //a=2;b=10
5 a=a+b;    //a=12;b=10

它的原理:把a,b看做数轴上的两个点。

第一句“a=b-a”求出了ab两点之间的距离,并且将其保存在a中;

第二句“b=b-a”求出了a到原点的距离(b到原点的距离减去ab两点距离),并且将其保存在b中;

第三句“a=b+a”求出了b到原点的距离(a到原点的距离加上ab两点距离),并且将其保存在a中。

缺点:只能用于数字类型,字符串的交换就不行。

方法二:位运算

1 int a=10,b=12;
2 a=a^b;
3 b=a^b;
4 a=a^b;

它的原理:任意一个数与任意一个给定的数异或两次,值不变。

方法三:指针操作

 1 int *a,*b;
 2 a=new int(20);
 3 b=new int(10);
 4 if(a<b)
 5 {
 6     a=(int*)(b-a);
 7     b=(int*)(b-(int(a)&0x0000ffff));
 8     a=(int*)(b+(int(a)&0x0000ffff));
 9 }
10 else
11 {
12     b=(int*)(a-b);
13     a=(int*)(a-(int(b)&0x0000ffff));
14     b=(int*)(a+(int(b)&0x0000ffff));
15 }

它的原理:它交换的是a和b的地址,而变量的值在内存中是没有移动过的。

其中,与运算“int(a)&0x0000ffff”,因为地址中高16位为段地址,后16位为位移地址,将它和0x0000ffff进行与运算后,段地址被屏蔽,只保留位移地址。例如:若&a=0x008f0200h,&b=0x008f1200h,在执行“a=(int*)(b-a);”时,a的值并不是0x00000200h,而是要加上变量a所在内存区的基地址,即实际结果是0x008f0200h。其中,0x008f是基地址,0200是a在该内存区的位移。

其次,地址运算不能出现负数,所以要先判断a和b的大小。

如有不对的地方,非常欢迎给予指导!

——【感谢】资料来源于http://blog.csdn.net/kangkermit/article/details/21371159

时间: 2024-11-05 18:55:33

【编程题】不引入第三个变量,而交换两个变量的值的相关文章

不用新的变量,交换两个变量的值。

不用新的变量,交换两个变量的值.比如有2个变量a , b ,我们希望交换他们的值. 下面介绍两种不同的解法: 第一种:基于加减法 a = a + b ;   //先让a等于和 b = a - b ;  //和减去原来b的值得到原来a的值,赋值给b a = a - b : //和减去改变后b的值(原来a的值)得到原来b的值,赋值给a 第二种:基于异或运算 a = a ^ b  // 先a异或上b,赋值给a b = a ^ b  // a异或上b,消去b的影响得到原来的a,赋值给b a = a ^

不用临时变量,交换两个变量的值

在学习C语言的时候,涉及到两个变量值的交换,其中用到临时变量.类似于:temp=a;a=b;b=temp;这样的语句,如果在没有临时变量的情况下,该如何做呢?网络上的人们给出了两种方法:一.异或法a=a^b;b=b^a;a=a^b;二.加减法a = a + b; b = a - b; a = a - b;其实我们看加减法更容易理解,也有许多人用这种方法,虽然这些方法可能用不到,但是了解下还是有必要的,至少要读懂别人的代码是吧. 其实两个方法都类似,我们没有临时变量,就自己用一个来做临时变量(相当

PHP 不使用第三个变量实现交换两个变量的值

//字符串版本 结合使用substr,strlen两个方法实现$a="a";$b="b";echo '交换前 $a:'.$a.',$b:'.$b.'<br />';$a.=$b;$b=substr($a,0,(strlen($a)-strlen($b)));$a=substr($a, strlen($b));echo '交换后$a:'.$a.',$b:'.$b.'<br />'; echo '-----------------------&l

不利用临时变量,交换两个变量的值

1.借助中间量交换 通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换.代码如下: int x = 10; int y = 20; int temp = x; x = y; y = temp; 这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用.在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法).上面的算法最大的缺点就是需要借助一个临时变量.那么不借助临时变量可

PHP中不用第三个变量交换两个变量的值

相信大家在PHP面试或者学习中经常会遇到这个问题就是“不用第三个变量来交换两个变量的值”,今天正对这个问题来讨论一下: 第一种方法:首先会想到的 这种方法简单可行,顺利的交换了两个变量的值. 第二种方法呢,稍加思考我们就会用到PHP中的函数来实现 第三种方法呢,我们来采用PHP中提供各种字符串分割函数来实现. 简单的题目不同的思想就会有不同的解法,期待更多的答案.

如何不使用第三个变量来交换两个数的值

最近在看<c++从入门到精通>自学c++,里面有一道课后题是如何做到不适用第三个变量来交换两个数的值,以下是我在网上查找到的资料,记录下并作为笔记. 题目:a=10,b=15,将a / b的值互换. 通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换.代码如下:      int a,b;      a=10; b=15;      int t;      t=a; a=b; b=t;      这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用

JavaScript中交换两个变量的值得三种做法(代码实现)

javascript在编程时经常会涉及到如何交换两个变量的值,例如常见的冒泡排序,快速排序等:下面我讲根据自己近期所学总结几种常见的交换两个变量值的方法: 方法一:借助第三方变量交换两个变量的值 var num1=20; var num2=50; var temp=num1; num1=num2; num2=temp; console.log(num1);//在控制台输出交换后的num1=50 console.log(num2);//在控制台输出交换后的num2=20 方法二:借助加法计算,交换

不借助第三个变量,交换两个变量值的3种方式

今天在我们学校的OJ上做题,一道非常简单的题,突然想试试能不能不借助第三个变量,交换两个变量值.蒙出来一半了已经,好可惜.现在把方法写在这里,希望以后不要忘记. 1 void fun1() 2 { 3 int a = 10, b = 100; 4 5 a = a + b; 6 b = a - b: 7 a = a - b; 8 printf("%d\n%d\n", a, b); 9 } 10 11 void fun2() 12 { 13 int a = 10, b = 100; 14

交换两个变量以及不用第三个变量交换两个变量

这个可能网上一搜一大把一大把的,可是今天我看到了一个新的写法,所以就写这篇文章记录一下,不不知道百度有没有,没去搜索! 方法1:这是最简单,也是最常用的一个方法! int n1 = 10, n2 = 20; int tmp = n1; n1 = n2; n2 = tmp; Console.WriteLine("n1={0},n2={1}", n1, n2); Console.ReadKey(); 方法2:算术运算 //交换两个变量,不使用第三个变量 int n1 = 10, n2 =