c语言4个数大小排序ns图,【C语言之三个数比较大小】switch用9行代码就能实现三个数大小排序?你绝对没见过的船新版本写法.........

目录

1.灵感来源

玩过硬件的对“位运算”都不陌生,但很多人初学的C语言的时候肯定不会重视位运算(晦涩难懂),因此我们学什么都是按部就班老师教什么学什么。

那是什么让我想出的这个写法呢?

事情是这样的:今天在玩arduino遥感模块的时候,涉及x,y,z方向上的取值或取值范围来判断方位,原型是不是有点像三个数比较大小?按照惯性思维肯定就是三个数和某个数比较大小来判断,if else嵌套,但是觉得好麻烦,于是乎,想着能不能用switch来实现。

2.算法实现及原理分析

下面是主要的实现代码,先贴代码再分析,不给点赞不愿意!

switch ((a >= b) << 2 | (b >= c) << 1 | (a >= c))

{

case 0:max = c; mid = b; min = a; break;

case 2:max = b; mid = c; min = a; break;

case 3:max = b; mid = a; min = c; break;

case 4:max = c; mid = a; min = b; break;

case 5:max = a; mid = c; min = b; break;

case 7:max = a; mid = b; min = c; break;

}

数数,是不是9行!

原理分析:乍一看,大喊卧槽,定睛一看,原来是这样。

首先看(a >= b) << 2,我们知道比较运算符结果为True or False,也就是对应二进制1和0,那么这个问题就简单了:假设成立,那么a>=b其实值为1,左移两位也就是0001<<2=0100,就是你们理解的乘以4;后面两个条件同理,通过位或(|)运算这样我们就能知道哪些条件是成立的哪些是不成立的。

这样从0000-0111之间就会产生8个值,现在我们再看一个简单的排列组合问题,三个数比较大小,会有几种情况:

无非就是三个坑,把三个数分别填进去,就是 3 x 2 x 1 = 6种,也就是说这8个值有两个是不可能成立的条件;

分析到这里相信大家都懂了,还不懂?没关系,带你分析一个case,

比如说case 0;也就是(a >= b) << 2 | (b >= c) << 1 | (a >= c)这个值为0,也就是说三个条件都不成立,那就好分析了:a>=b不成立,说明a

3.完整代码及验证

#include

#include

void main()

{

int a , b , c ;

int max,mid,min;

printf("请依次输入a,b,c,中间用空格隔开:");

scanf("%d %d %d", &a, &b, &c);

switch ((a >= b) << 2 | (b >= c) << 1 | (a >= c))

{

case 0:max = c; mid = b; min = a; break;

case 2:max = b; mid = c; min = a; break;

case 3:max = b; mid = a; min = c; break;

case 4:max = c; mid = a; min = b; break;

case 5:max = a; mid = c; min = b; break;

case 7:max = a; mid = b; min = c; break;

}

printf("最大数为=%d 中间数为=%d 最小数为=%d\n", max, mid, min);

system("pause");

}

为了方便验证,加了个死循环:

81266f639013df8502e9a41e9c121bf8.png

是不是感觉有、意思了。欢迎关注【菜小涛】,一个成长中的小白。

标签:case,min,max,......,mid,C语言,break,switch

来源: https://blog.csdn.net/weixin_43894786/article/details/105686413

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值