黑马程序员技术交流社区

标题: 一个很有意思的题,求解释代码。。。 [打印本页]

作者: 周四川    时间: 2012-4-16 20:43
标题: 一个很有意思的题,求解释代码。。。
定义两个变量a和b,不使用第三个变量,使两个值交换
a =a+b; b =a –b; a =a-b;
这代码看不明白,有木有高人指点一二啊?
作者: 周四川    时间: 2012-4-16 21:06
heima_dinghua 发表于 2012-4-16 20:52
为方便解释:我用记号a来表示第i次a的值,b表示第i次b的值
初始值为a[0],b[0]
a=a+b      a[1]=a[0]+b[0]

谢谢,看的很清楚,有劳啦。。。
作者: 王永旺    时间: 2012-4-16 21:14
可以假设a中的值为'a',b中的值为‘b’;
a =a+b;          //   此时a=('a'+'b')
b =a –b;        //b=  ('a'+'b')-b  ='a'
  a =a-b;          //a=('a'+'b')-'a'  ='b'
作者: 李斌    时间: 2012-4-17 01:02
用异或也行哦
int a=2,b=3;
a=a^b
b=a^b//(a^b)^b a异或b两次为a 这一步把a赋给b.即b=a
a=a^b// a^(a^b)b异或a两次为b 所以得到a=b
完成互换
作者: 黄或俊    时间: 2012-4-17 01:04
刚好把今天(其实就是昨天啦!)课后老师步骤的题目贡献出来
7:对两个整数变量的值进行互换。(这种题没讲过,没思路的可以先放下)
提示:
第一种:使用第三方变量
第二种:不需要第三方变量,思考下异或运输符的特点。

class HomeworkDay02_07
{
        public static void main(String[] args)
        {
                //第一种:使用第三方变量
                int temp;
                int a=12;
                int b=34;
                System.out.println("互换前:a="+a);
                System.out.println("互换前:b="+b);
                temp=a;
                a=b;
                b=temp;
                System.out.println("互换后:a="+a);
                System.out.println("互换后:b="+b);
                System.out.println("******************************");
                //不需要第三方变量
                int i=56;
                int j=78;
                System.out.println("互换前:i="+i);
                System.out.println("互换前:j="+j);
                i=i+j;
                j=i-j;//相当于 j = (i+j)-j=i
                i=i-j;//相当于 i = (i+j)-i=j
                System.out.println("互换后:i="+i);
                System.out.println("互换后:j="+j);
                System.out.println("******************************");
                //使用^异或,一个数异或同一个数两次,结果还是原来那个数
                int x=321;
                int y=123;
                System.out.println("互换前:x="+x);
                System.out.println("互换前:y="+y);
                x=x^y;
                y=x^y;//相当于 y = (x^y)^y
                x=y^x;//相当于 x = x^(x^y)
                System.out.println("互换后:x="+x);
                System.out.println("互换后:y="+y);
        }
}

作者: 贠(yun)靖    时间: 2012-4-17 10:19
heima_dinghua 发表于 2012-4-16 20:52
为方便解释:我用记号a来表示第i次a的值,b表示第i次b的值
初始值为a[0],b[0]
a=a+b      a[1]=a[0]+b[0]

b = a-b  这的b已经是a了  你再a = a-b  就是a-a了 哥们
  你后面那个用数组解释的原理美错   但是你第二步b的值已经改变了  要把b=a 再换回b=a-b才行

作者: 黑马—王宁    时间: 2012-4-17 10:26
a b 互换了。
作者: 韩新凯    时间: 2012-4-17 10:40
a =a+b; b =a –b; a =a-b;
首先有两个数a,b;
a=a+b;是把a+b的值赋给了a;此时a的值已经变成了a,b的和;
b=a-b;是把a-b的值赋给了b;因为上面a已经变成了a+b;所以这里的b=a-b=(a+b)-b=a;
到这里,a的值仍然是是a+b,而b的值是已经变成了a;
接下来,a=a-b;和上面一样可以写成a=a-b=(a+b)-b=(a+b)-a=b;(在上面的一步b已经变成了a)
到此,a,b完成了互换。
作者: 张亮    时间: 2012-4-17 11:50
最简单的解释:
a =a+b;      b =a –b;                  a =a-b;
                  b=(a+b)-b=a          a=(a+b)-a=b
作者: 贠(yun)靖    时间: 2012-4-17 12:06
heima_dinghua 发表于 2012-4-17 10:46
哥们好像是你错了,b=a-b执行后,b的值为原来没有操作过的a,再执行a=a-b时,等式右边的a值为初始的(a+b ...

hehe 我想错了一步 :L
作者: 吴凡    时间: 2012-8-9 17:22
//不使用第三个变量实现俩个数的交换
     int m = 10;
        int n = 40;
        n = m + n;//n的值为50
        m = n - m;//m的值为40
        n = n - m;//n的值为10
       看懂了不?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2