永发信息网

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

答案:3  悬赏:0  手机版
解决时间 2021-11-17 02:06
  • 提问者网友:杀手的诗
  • 2021-11-16 20:54
如何不使用第三个变量来交换两个数的值?
最佳答案
  • 五星知识达人网友:由着我着迷
  • 2021-11-16 21:37
算术运算;指针地址操作;位运算;栈实现。
具体操作如下:
    算术运算
    int a,b;
    a=10;b=12;
    a=b-a; //a=2;b=12
    b=b-a; //a=2;b=10
    a=b+a; //a=10;b=10
它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。
具体过程:第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。完成交换。
此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。(以下称为算术算法)
缺点:是只能用于数字类型,字符串之类的就不可以了。a+b有可能溢出(超出int的范围),溢出是相对的, +了溢出了,-回来不就好了,所以溢出不溢出没关系,就是不安全。
    指针地址操作
    int *a,*b; //假设
    *a=new int(10);
    *b=new int(20); //&a=0x00001000h,&b=0x00001200h

    a=(int*)(b-a); //&a=0x00000200h,&b=0x00001200h

    b=(int*)(b-a); //&a=0x00000200h,&b=0x00001000h

    a=(int*)(b+int(a)); //&a=0x00001200h,&b=0x00001000h
因为对地址的操作实际上进行的是整数运算,比如:两个地址相减得到一个整数,表示两个变量在内存中的储存位置隔了多少个字节;地址和一个整数相加即“a+10”表示以a为基地址的在a后10个a类数据单元的地址。所以理论上可以通过和算术算法类似的运算来完成地址的交换,从而达到交换变量的目的。
    位运算
    int a=10,b=12; //a=1010^b=1100;
    a=a^b; //a=0110^b=1100;
    b=a^b; //a=0110^b=1010;
    a=a^b; //a=1100=12;b=1010;
此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,其他位不变。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。
    栈实现。
    int exchange(int x,int y) 

    stack S; 
    push(S,x); 
    push(S,y); 
    x=pop(S); 
    y=pop(S); 
    }
以上算法均实现了不借助其他变量来完成两个变量值的交换,相比较而言算术算法和位算法计算量相当,地址算法中计算较复杂,却可以很轻松的实现大类型(比如自定义的类或结构)的交换,而前两种只能进行整形数据的交换(理论上重载“^”运算符,也可以实现任意结构的交换)。
全部回答
  • 1楼网友:行路难
  • 2021-11-16 23:19

1) 算术运算
简单来说,就是通过普通的+和-运算来实现。代码如下:int a,b;a=10;b=12;a=b-a;//a=2;b=12b=b-a; //a=2;b=10a=b+a; //a=10;b=10通过以上运算,a和b中的值就进行了交换。表面上看起来很简单,但是不容易想到,尤其是在习惯标准算法之后。它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。具体过程:第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。2)完成交换。此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。(以下称为算术算法)该算法还可以这样做:int a,b;
a=10;b=12;a=a+b=22;b=a-b=10;a=a-b=12;两个减操作一个加操作,执行的先后顺序不一样,其原理也稍微有些区别,但根本原理是一样滴。3) 位运算通过异或运算也能实现变量的交换,:inta=10,b=12;//a=1010^b=1100;a=a^b;//a=0110^b=1100;b=a^b; //a=0110^b=1010;a=a^b; //a=1100=12;b=1010;此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,其他位不变。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。即:a^b^b=a。将a=a^b代入b=a^b则得b=a^b^b=a;同理可以得到a=b^a^a=b;轻松完成交换。以上三个算法均实现了不借助其他变量来完成两个变量值的交换,相比较而言算术算法和位算法计算量相当,地址算法中计算较复杂,却可以很轻松的实现大类型(比如自定义的类或结构)的交换,而前两种只能进行整形数据的交换(理论上重载“^”运算符,也可以实现任意结构的交换)。

用异或操作就可以交换两个数了( ^ 就是异或操作)
b = a ^ b;
a = a ^ b;
b = a ^ b;
因为:a ^ b ^ b = a,这是异或的一个特性

如果异或用于或非表示的话,就是:a ^ b = (a or b) and (!a or !b)
注:
a or b  表示"a 或 b"
a and b 表示"a 与 b"
!a 表示 "非a"

所以可以这样交换两个数:
b = (a or b) and (!a or !b);
a = (a or b) and (!a or !b);
b = (a or b) and (!a or !b);

  • 2楼网友:雪起风沙痕
  • 2021-11-16 23:09

算术运算
int a,b;
a=10;b=12;
a=b-a; //a=2;b=12
b=b-a; //a=2;b=10
a=b+a; //a=10;b=10
它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。
具体过程:“a=b-a”求出ab两点的距离,并且将其保存在a中;“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。完成交换。此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。

位运算,此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,其他位不变。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。

int a=10,b=12; //a=1010^b=1100;
a=a^b; //a=0110^b=1100;
b=a^b; //a=0110^b=1010;
a=a^b; //a=1100=12;b=1010;

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯