C语言swich比较数的大小,比较两个数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

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

int get_min( int a, int b )

{

return a>b;

}

int get_max( int a, int b )

{

return a

}

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

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。

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值