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