zoukankan      html  css  js  c++  java
  • 交换两个变量,只使用2个变量——权当面试了解使用

    数学分析法:

     1 #include<stdio.h>  
     2 int main()
     3 {
     4     int a = 10;
     5     int b = 20;
     6     a = a + b;
     7     b = a - b;
     8     a = a - b;
     9     printf("a=%d b=%d
    ", a, b);
    10 
    11     return 0;
    12 }

    我们知道两个加数,一定可以交换它们的值。a+b求得它们的和,比如为sum,但我们完全可以不再定义一个变量sum,而赋值给a或者b都是可以的,为什么呢?因为知道两个数的和,以及其中一个加数,一定可以得到另一个数。所以就算先覆盖一个加数也是无所谓的。得到a+b的和赋值给a之后,要把a和b交换,只用将a(sum)减去b,此时减出来的结果相当于最初的a(10),赋值给b了。道理很简单,a+b=sum;那么一定有sum-b=a。6-7行之后,a还是sum,b已经是之前的a了,最后就该把最初的b赋值给a了,已经很简单,和与加数知道两个即可,此时a(sum=30)-b(此时已经是a了,b=10),要交换,只用把a(sum=30)-b(10)赋值给a,这样就达到两个变量交换的目的了。

    为了锻炼思维,可把上面第6行变成:b=a+b;那么后面该怎么写?如果理解了的话应该是不困难的。

    eg:

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

    但是这样的方法有一点不好,就是可能会有溢出,万一两个int相加大于最大的数了,这个方法就失效了。

    所以,需要另外一种方法:

    异或:相同为0,不同为1.即1^1=0;1^0=1。X^0=X,a^b=b^a,a^b^c=(a^b)^c=a^(b^c).

     1 #include<stdio.h>  
     2 int main()
     3 {
     4     int a = 1;
     5     int b = 2;
     6     a = a ^ b;
     7     b = a ^ b;
     8     a = a ^ b;
     9     printf("a=%d b=%d
    ", a, b);
    10 
    11     return 0;
    12 }

    只用将上面的减号变成异或(^)就可以实现交换,上诉代码其实是第一种方式的翻版。

    但通过汇编代码发现,少一个变量,并不意味着更快。这个方式,只是为了可能的面试题。实际开发中,还是用三个变量转换的更好。

  • 相关阅读:
    类名+函数名(参数1,参数2.....){.......return this;}
    报错!无法从静态上下文中引用非静态 变量
    ERROR无法从静态上下文中引用非静态变量
    字符编码笔记:ASCII,Unicode和UTF-8
    MySQL其他类型常用函数
    MySQL流程函数
    MySQL日期和时间函数
    MySQL数值函数
    MySQL字符串函数
    MySQL位运算符优先级
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/6593856.html
Copyright © 2011-2022 走看看