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

目录


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


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

在这里插入图片描述

  

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章