14

我想只用+=and-=运算符交换两个变量,而没有临时变量。我知道标准解决方案,例如:

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

并与xor

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

但我无法弄清楚如何仅使用+=and来做到这一点-=。可能吗?

4

3 回答 3

10

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

让我们表示aas(1 0)bas(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. a-=b. 与3.

然后将此证明应用于b-=b, b+=b, b+=a, b-=a。所以行列式不会改变它的符号或者它是0

更新 2:正如@Tom 所说,这里是如何在 C# 中执行此操作的示例: http: //ideone.com/UzVLML。但是,在 C 中这是不正确的:http ://codepad.org/Rmhn9iqb 。有人可以澄清 b -= b += bC 和 C# 的区别吗?

于 2013-05-21T11:02:52.700 回答
2

尽管 OP 已经证明这是不可能的,但我们可以用现代语言作弊。

        a += b;
        b -= b += b; // Negates b in most languages, but not in C
        b += a;
        a -= b;
于 2013-05-21T09:59:43.477 回答
0
    a +=b;
    b -=a;
    b =-b;
    a -=b;
于 2013-05-21T10:02:20.097 回答