두 번째의 가변 개수의 값을 교환하는데 사용되지 않는 방법을 두 번째 변수는 변수의 값이 변경되지 않을

 

어떻게 두 숫자의 값을 교환하는 세 번째 변수를 사용하지

 

  최근 자기 학습 C ++ "마스터 입장에서 C ++를"읽기, 방과 후 두 숫자의 세 번째 변수의 교환 가치에 적용되지 않는 방법의 문제가, 다음은 내가 온라인 정보를 발견하고, 다음 레코드 무엇인가 참고로.

      제목 : A는 = 10, B = (15), A / B 값은 교환.

      보통 우리는 (특히 학습 단계에서) 연습 : 새 변수를 정의, 그것은 교환에 의해 이루어집니다. 다음 코드
      INT A, B,
      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 // A = 10, B = 10
      이상의 동작에 의해이 a 및 b 값은 수익을 교환한다. 겉으로 간단하지만 특히 관습 표준 알고리즘 후, 생각하는 것은 쉬운 일이 아니다.
      그 원리는 다음 약 2 점 사이의 거리를 산출하는 포인트의 수로서 간주 A, B 축.
      특정 공정 : 먼저 "A = BA"은 AB에, 두 지점에서 얻어지고, 저장되고, 두 번째 문장 "B = BA"원점에서 결정된 거리 (AB 원점으로부터 거리 B 거리 두 점 사이의 차이), 및 B에 저장된 상기 제 문장 "A = B +는"원점과의 거리 지점 AB로 (거리)에 원점으로부터 결정된 거리 B 및 저장된 매체이다. 교환을 완료합니다.
      이 알고리즘은 표준 알고리즘으로, 세 개 계산의 과정보다는, 그러나 임시 변수에 의지하지 않고 비교됩니다. (이하,이 연산 알고리즘이라고도 함)

      이 알고리즘은이 작업을 수행 할 수 있습니다 :

      A, B에서 INT;

      A = 10, B = 12;

      A = A + B = 22;

      B = AB = 10;

      A = AB = 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;轻松完成交换。

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

     

  最近在看《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