ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-04-23 11:38:17  阅读:643  来源: 互联网

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


目录


1.灵感来源
2.算法实现及原理分析
3.完整代码及验证

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<b,同理b<c,a<c;因此三个数大小关系为:max = c; mid = b; min = a;其他的case同理哦。

3.完整代码及验证
#include<stdio.h>
#include<stdlib.h>

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");
}


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

在这里插入图片描述

  

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

标签:case,min,max,......,mid,C语言,break,switch
来源: https://blog.csdn.net/weixin_43894786/article/details/105686413

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有