A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周四川 中级黑马   /  2012-4-16 20:43  /  3380 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

定义两个变量a和b,不使用第三个变量,使两个值交换
a =a+b; b =a –b; a =a-b;
这代码看不明白,有木有高人指点一二啊?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

14 个回复

倒序浏览
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]

谢谢,看的很清楚,有劳啦。。。
回复 使用道具 举报
可以假设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'

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
用异或也行哦
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
完成互换

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
刚好把今天(其实就是昨天啦!)课后老师步骤的题目贡献出来
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);
        }
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
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才行
回复 使用道具 举报
a b 互换了。
回复 使用道具 举报
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完成了互换。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
张亮 中级黑马 2012-4-17 11:50:49
9#
最简单的解释:
a =a+b;      b =a –b;                  a =a-b;
                  b=(a+b)-b=a          a=(a+b)-a=b

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
heima_dinghua 发表于 2012-4-17 10:46
哥们好像是你错了,b=a-b执行后,b的值为原来没有操作过的a,再执行a=a-b时,等式右边的a值为初始的(a+b ...

hehe 我想错了一步 :L
回复 使用道具 举报
//不使用第三个变量实现俩个数的交换
     int m = 10;
        int n = 40;
        n = m + n;//n的值为50
        m = n - m;//m的值为40
        n = n - m;//n的值为10
       看懂了不?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马