• 比较两个数a、b的大小,不能使用大于/小于、if、switch,?:等判断语句


    本片博文整理自网上的资料,再次一并谢谢:
    http://blog.csdn.net/zhanxuw/article/details/4489715

    http://tangyuan1314.iteye.com/blog/1485559

     第一种方法 :

    sum=a+b;
    delta=abs(a-b);
    max=(sum+delta)/2;
    min=sum-max;

    其实原理就是任何两个数 a, b 都可以唯一表示为
    a=x+y;
    b=x-y;
    然后最大值就是 x+abs(y)。 不过,abs这个函数是利用到了 ?: 运算符的,还有sum可能会溢出,不过这个算法还是很赞的。

     第二种方法 :

    (a>=b && (max=a))  || ( a < b && (max=b));

    这里要注意的是 ( a < b && (max=b) )不可以写成(max=b),这样写的话,当a == 0, b < 0 时,max = a 后(a>=b&&max=a) 就为0,所以会进行后面的计算,max = b;这样就错了。这种方法没有溢出的危险。
    测试代码:1:

    #include <stdio.h>
    
    int main(void)
    {
    	int a = 3;
    	int b = 2;
    
    	int max;
    	
    	(a>=b && (max=a)) || ( a < b && (max=b));	
    	
    	printf("The max is %d :\n",max);
    
    	return 0;
    }
    运用数组:
    测试代码2:

    #include<stdio.h>
    
    int get_min( int a, int b )
    {
    	return a>b;
    }
    int get_max( int a, int b )
    {
    	return a<b;
    }
    int main()
    {
    	int a, b;
    	int buf[2];
    	int min, max;
    	a = 3;
    	b = 7;
    	buf[0] = a;
    	buf[1] = b;
    	min = buf[get_min(a,b)];
    	max = buf[get_max(a,b)];
    	printf("%d,%d/n", min, max);
    	return 0;
    }
    
    下面的版本是考虑溢出,即判断两个数的符号相同否,相同的话就不会产生溢出。不相同的话,直接看符号位就ok了。下面上代码。
    测试代码:

    #include <stdio.h>
    
    int main(void)
    {
    	int x = 3;
    	int y = 2;
    
    	int ret = max(x,y);
    	
    	printf("The max is %d :\n",ret);
    
    	return 0;
    }
    
    
    int max1(int x,int y) //符号相同,返回x,y中的大值
    {
    	unsigned int z;
    	z=((x-y)>>31)&1;
    
    	return (1-z)*x+z*y;//这种写法很巧妙
    }
    
    int max2(int x,int y) //符号不同,直接判断x的正负即可,返回最大值
    {
    	unsigned int z;
    	z=(x>>31)&1;
    
    	return (1-z)*x+z*y;
    }
    
    int max(int x,int y)
    {
    	unsigned int z;
    	z=((x^y)>>31)&1;//异或操作,判断符号位是否相同
    
    	return (1-z)*max1(x,y)+z*max2(x,y);
    }
    
    /* 
    在考虑溢出的情况下,unsigned int z=((x^y)>;>;31)&1的值有两种可能,x、y同号时为0,x、y异号时为1。当x、y同号时x-y不会溢出,可参考max1,得出最大值;当x、y异号时,取正的那个就是最大值max。
    */




  • 相关阅读:
    正则表达式
    navicat 远程连接mysql
    配置网络
    swoole 定时器
    goroutine调度源码阅读笔记
    Golang GC 算法
    git常用操作合集
    utf8和utf8mb4的区别
    正则表达式忽略分组顺序匹配(前瞻、后顾、负前瞻、负后顾的应用)
    goroutine上下文切换机制
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007628.html
Copyright © 2020-2023  润新知