Можно ли заменить две переменные только с + = и - = другими операторами или переменными?

Я хочу обменять две переменные только с операторами += и -= и без временных переменных. Я знаю стандартные решения вроде:

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

и xor:

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

но я не могу понять, как это сделать только с += и -=. Возможно ли это?

Ответы

Ответ 1

мои одноклассники предлагают приятное решение: ответ NO

обозначает a как (1 0) и b как (0 1)

матрица a равна

1 0
0 1

+= и -= означают добавление или вычитание строк друг другу. Это означает, что определитель либо не меняет своего знака, либо равен 0. Конечная матрица

0 1
1 0

с определителем, равным -1, поэтому вы не можете его получить

UPDATE: у вас есть следующие операции:

  • 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, вот пример того, как это сделать на С#: http://ideone.com/UzVLML. Однако в C это неверно: http://codepad.org/Rmhn9iqb. Может ли кто-нибудь уточнить разницу b -= b += b в C и С#?

Ответ 2

Хотя OP доказал, что это невозможно, мы можем обмануть на современных языках.

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

Ответ 3

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