14

+=2 つの変数をand-=演算子のみで、一時変数なしで交換したいと考えています。次のような標準的なソリューションを知っています。

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

xor:

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

+=しかし、 と だけでそれを行う方法がわかりません-=。出来ますか?

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. 1行になります0ので、det=0
  2. a+=a. これは、行に を掛けることを意味する2ので、det A'= 2*det A
  3. a+=b. それは基本的な変換を意味し、値を変更しませんdet
  4. a-=b. と同じこと3.

次に、この証明をb-=bb+=bb+=a、 に適用しますb-=a。したがって、行列式はその符号を変更しないか、0

更新 2: @Tom が言ったように、C# でそれを行う方法の例は次のとおりです: http://ideone.com/UzVLML。ただし、C では正しくありません: http://codepad.org/Rmhn9iqbb -= b += b誰かが C と 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 に答える