我想只用+=and-=运算符交换两个变量,而没有临时变量。我知道标准解决方案,例如:
a = a+b;
b = a-b;
a = a-b;
并与xor:
a ^= b;
b ^= a;
a ^= b;
但我无法弄清楚如何仅使用+=and来做到这一点-=。可能吗?
我的同学提供了一个很好的解决方案:答案是NO
让我们表示aas(1 0)和bas(0 1)
矩阵A是
1 0
0 1
+=意思是相互增加或-=减少线条。这意味着行列式要么不改变其符号,要么等于0。结束矩阵是
0 1
1 0
行列式等于-1,所以你不能得到它
更新:你有这些操作:
a-=a. 一行变成0,所以det=0a+=a. 这意味着将一行乘以2,所以det A'= 2*det Aa+=b. 这意味着基本变换,它不会改变deta-=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# 的区别吗?
尽管 OP 已经证明这是不可能的,但我们可以用现代语言作弊。
a += b;
b -= b += b; // Negates b in most languages, but not in C
b += a;
a -= b;
a +=b;
b -=a;
b =-b;
a -=b;