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


爲了方便驗證,加了個死循環:

在這裏插入圖片描述

  

是不是感覺有、意思了。歡迎關注【菜小濤】,一個成長中的小白。

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