是否可以仅使用+ =和 - =交换两个变量?没有其他运算符或变量?

时间:2013-05-21 09:53:24

标签: c swap

我想仅使用+=-=运算符交换两个变量,而不使用临时变量。我知道标准的解决方案,如:

a = a+b;
b = a-b;
a = a-b;

xor

a ^= b;
b ^= a;
a ^= b;

但我无法弄清楚如何只使用+=-=。有可能吗?

3 个答案:

答案 0 :(得分:10)

我的同学提供了一个很好的解决方案: 答案是NO

允许将a表示为(1 0),将b表示为(0 1)

矩阵A

1 0
0 1

+=-=表示相互添加或减少行。这意味着行列式要么不改变其符号,要么等于0

结束矩阵
0 1
1 0

决定因素等于-1,所以你无法得到它

更新: 你有这些操作:

  1. a-=a。一行变为0,因此det=0
  2. a+=a。这意味着将一行乘以2,所以det A'= 2*det A
  3. a+=b。这意味着初等转换,它不会改变det
  4. 的值
  5. a-=b。与3.
  6. 相同

    然后将此证明应用于b-=bb+=bb+=ab-=a。因此,行列式不会改变其符号,也不会改为0

    更新2: 正如@Tom所说,这是在C#中如何做到这一点的例子:http://ideone.com/UzVLML。但是,在C中不正确:http://codepad.org/Rmhn9iqb。有人可以澄清C和C#中b -= b += b的区别吗?

答案 1 :(得分:2)

虽然OP证明它是不可能的,但我们可以用现代语言作弊。

        a += b;
        b -= b += b; // Negates b in most languages, but not in C
        b += a;
        a -= b;

答案 2 :(得分:0)

    a +=b;
    b -=a;
    b =-b;
    a -=b;