2の第三可変数の値を交換するために使用されていませんどのように2つの変数が3番目の変数の値によって変化しません。

 

2つの数の値を交換するために第三の変数を使用しない方法

 

  最近、自己学習C「マスターへのエントリからC ++を」読み++、放課後2つの数の3番目の変数交換価値には適用されませんかの質問があり、以下は私がオンライン情報で見つけたもので、次のレコードノートとして。

      タイトル:= 10、B = 15、A / Bの値を入れ替え。

      通常、我々は(特に学習段階で)練習:新しい変数を定義し、それが交換によって行われます。以下のコード:
      int型A、B;
      A = 10、B = 15;
      INT T;
      T = A; A = B; B = T;
      このアルゴリズムは、コンピュータプログラムの特性を理解するために特に適した出発点、理解することは容易であるが、割り当てられています古典的なアプリケーションのステートメント。変数の値は、通常の状況下で遭遇交換実際のソフトウェア開発の中で、アルゴリズムは単純であり、プログラマの間の通信を容易にするために曖昧、、、これはアルゴリズム(以下、標準アルゴリズムと呼ぶ)を採用すべきです。

      最大の欠点は、一時変数上記のアルゴリズムを使用する必要があります。だから、一時変数の助けを借りずにそれと引き換えに達成することができますか?答えはイエスです!

      1)算術
      演算を実現するために-簡単に言えば、従来+によるものであると。以下のコード:
      int型A、B;
      A = 10、B = 12であり、
      A = BA; // = A 2; B = 12である
      // = A 2; B = 10 B = BA
      A = B + A; // = 10、B = 10
      以上の動作により、Bの値は、移行を交換します。一見シンプルですが、特に慣習標準アルゴリズムの後に、考えることは容易ではありません。
      その原理は、周りの2点間の距離を計算する点の数とみなし、A、B軸。
      特定のプロセス:第一「= BAが」にAB二つの点から得られ、そして保存され、第二の文「B = BA」原点から所定の距離(原点からのABの距離B距離の二点間の差)、及び(b)に保存され、3番目の文「= B +」b)は原点との距離点ABまでの距離(原点からの距離を決定し、保存されましたメディアインチ 交換を完了します。
      このアルゴリズムは、標準的なアルゴリズムで、さらに3つの計算のプロセスよりますが、一時的な変数に頼らずに比較されます。(以下は、算術アルゴリズムとも呼ばれます)

      アルゴリズムは、これを行うことができます:

      int型のA、B;

      = 10、B = 12。

      A = A + B = 22。

      B = AB = 10。

      = AB = 12。

      二つの減算動作Aプラス操作の実行の順序は同じではありませんが、その原則は若干異なりますが、基本的な原理は同じドロップです。

      3) 位运算
      通过异或运算也能实现变量的交换,这也许是最为神奇的,请看以下代码:
      int a=10,b=12; //a=1010^b=1100;
      a=a^b; //a=0110^b=1100;
      b=a^b; //a=0110^b=1010;
      a=a^b; //a=1100=12;b=1010;
      此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,其他位不变。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。
      即:a^b^b=a。将a=a^b代入b=a^b则得b=a^b^b=a;同理可以得到a=b^a^a=b;轻松完成交换。

      以上三个算法均实现了不借助其他变量来完成两个变量值的交换,相比较而言算术算法和位算法计算量相当,地址算法中计算较复杂,却可以很轻松的实现大类型(比如自定义的类或结构)的交换,而前两种只能进行整形数据的交换(理论上重载“^”运算符,也可以实现任意结构的交换)。

     

  最近在看《c++从入门到精通》自学c++,里面有一道课后题是如何做到不适用第三个变量来交换两个数的值,以下是我在网上查找到的资料,记录下并作为笔记。

      题目:a=10,b=15,将a / b的值互换。

      通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。代码如下:
      int a,b;
      a=10; b=15;
      int t;
      t=a; a=b; b=t;
      这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用。在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法)。

      上面的算法最大的缺点就是需要借助一个临时变量。那么不借助临时变量可以实现交换吗?答案是肯定的!

      1) 算术运算
      简单来说,就是通过普通的+和-运算来实现。代码如下:
      int a,b;
      a=10;b=12;
      a=b-a; //a=2;b=12
      b=b-a; //a=2;b=10
      a=b+a; //a=10;b=10
      通过以上运算,a和b中的值就进行了交换。表面上看起来很简单,但是不容易想到,尤其是在习惯标准算法之后。
      它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。
      具体过程:第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。完成交换。
      此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。(以下称为算术算法)

      该算法还可以这样做:

      int a,b;

      a=10;b=12;

      a=a+b=22;

      b=a-b=10;

      a=a-b=12;

      两个减操作一个加操作,执行的先后顺序不一样,其原理也稍微有些区别,但根本原理是一样滴。

      3) 位运算
      通过异或运算也能实现变量的交换,这也许是最为神奇的,请看以下代码:
      int a=10,b=12; //a=1010^b=1100;
      a=a^b; //a=0110^b=1100;
      b=a^b; //a=0110^b=1010;
      a=a^b; //a=1100=12;b=1010;
      此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,其他位不变。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。
      即:a^b^b=a。将a=a^b代入b=a^b则得b=a^b^b=a;同理可以得到a=b^a^a=b;轻松完成交换。

      以上三个算法均实现了不借助其他变量来完成两个变量值的交换,相比较而言算术算法和位算法计算量相当,地址算法中计算较复杂,却可以很轻松的实现大类型(比如自定义的类或结构)的交换,而前两种只能进行整形数据的交换(理论上重载“^”运算符,也可以实现任意结构的交换)。

     

おすすめ

転載: www.cnblogs.com/hairfbk/p/11991539.html