zoukankan      html  css  js  c++  java
  • a、b交换与比较

    1.有两个变量a,b,不用if、?: 、switch 或其他判断语句,找出两个数中

    较大的:

    int max = ((a+b)+abs(a-b))/2

    较小的:

    int min = ((a+b)-abs(a-b))/2

    2.给3个整数a,b,c,用函数实现取3个数的中间数,不用sort。

    inline int max(int a,int b) {return a>=b? a:b;}
    inline int min(int a,int b) {return a<=b? a:b;}
    inline int medium(int a,int b,int c) 
    {
      int t1 = max(a,b);
      int t2 = max(b,c);
      int t3 = max(a,c);    
      return medium(t1.min(t2,t3);
    }

    3.如何交换a,b并且不适用任何中间变量?

    如果采用:

    a=a+b;
    b=a-b;  //b=(a+b)-b=a 
    a=a-b;  //a=(a+b)-a=b

    这样做的缺点是如果a、b都是比较大的数,a=a+b会超界。

    a=a^b;
    b=a^b;  //b=(a^b)^b=a  可见x^y=(x&~y)|(~x&y)证明 中的文氏图方法。
    a=a^b;  //a=(a^b)^a=b

     这样做好处是不会超界。

  • 相关阅读:
    递归
    匿名函数
    迭代器、可迭代对象、生成器
    日期
    大文件读写
    面向对象
    魔术方法
    进程与线程
    numpy常用函数
    shell编程
  • 原文地址:https://www.cnblogs.com/zhanbiqiang/p/4009580.html
Copyright © 2011-2022 走看看