我想仅使用+=
和-=
运算符交换两个变量,而不使用临时变量。我知道标准的解决方案,如:
a = a+b;
b = a-b;
a = a-b;
和xor
:
a ^= b;
b ^= a;
a ^= b;
但我无法弄清楚如何只使用+=
和-=
。有可能吗?
答案 0 :(得分:10)
我的同学提供了一个很好的解决方案:
答案是NO
允许将a
表示为(1 0)
,将b
表示为(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。有人可以澄清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;