比较两个数a、b的大小,不能使用大于/小于、if、switch,?:等判断语句
本片博文整理自网上的资料,再次一并谢谢:
http://blog.csdn.net/zhanxuw/article/details/4489715
【比较两个数a、b的大小,不能使用大于/小于、if、switch,?:等判断语句】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 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:
#includeint get_min( int a, int b )
{
return a>b;
}
int get_max( int a, int b )
{
return a
下面的版本是考虑溢出,即判断两个数的符号相同否,相同的话就不会产生溢出。不相同的话,直接看符号位就ok了。下面上代码。
测试代码:
#include 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。
*/
推荐阅读
- 太平之莲
- 赠己诗
- 眼光要放高远
- 人生两件宝(好身体,好心情!)
- 汇讲-勇于突破
- 画解算法(1.|画解算法:1. 两数之和)
- 发小的串门
- 两短篇
- 刘婵为何不娶关羽的女儿为妻子,而为何要娶张飞的两个女儿
- 幸福是个比较级