實現對編譯出來的名次進行順序排序

2021-07-13 08:34:09 字數 1437 閱讀 8454

前幾天,鵬哥在作業中給出了這樣一道題:

5位運動員參加了10公尺臺跳水比賽,有人讓他們**比賽結果

a選手說:b第一,我第三。

b選手說:我第二,e第四。

c選手說:我第一,d第二。

d選手說:c最後,我第三。

e選手說:我第四,a第一。

比賽結束後,每位選手都說對了一半,請程式設計確定比賽的名次。

這道題相信很多人都知道,程式寫起來也不是特別難,其主要的源程式如下:

#include

int main()

return 0;

我自己當時也是寫到這裡的,本以為就行了,可是輸出的結果並不是所期望的:

如圖所示,這和我們所想的並不一樣,照理來說應該只有第一種乙個答案才對,而它將一些名次不連續的組也輸出來了,有人覺得那只輸出第一行不就行了,可這只是一種取巧的方法,這道題只是它的答案恰好在第一行,那如果它在第二行或第三行以及其他行數呢?所以,這個程式還是要繼續改進的,這裡我和大家分享下學習到的方法:

首先我們目的是想讓其按連續的順序輸出來,中間不要空出數字,那我們可以將它放入乙個二進位制位中,如果它存入的值是連續的1,那就說明這個次序是連續的。

比如給定義乙個 int ret=0,由於只有5個名次,所以這裡ret只看它後八位,剛開始ret應該是0000 0000,如果是1的話,可直接讓它和ret相或,其結果是1,如果是2的話就讓1左移一位再和ret相或,如果是3就把1左移兩位再相或,以此類推,如果是n的話,就讓1左移(n-1)位和ret相或,這樣就能確保它的名次是連續的了,具體的**如下:

ret = ret | 1 << (a - 1);

ret = ret | 1 << (b - 1);

ret = ret | 1 << (c - 1);

ret = ret | 1 << (d - 1);

ret = ret | 1 << (e - 1);

這是我們將所有的名次存入ret中

while (ret)

if (ret % 2 == 0)

break;

else ret = ret / 2;

如果while迴圈整個執行完畢,那說明我們的ret此時為0,並且名次是按連續的順序輸出的;如果從break跳出迴圈的話,那此時ret就不等於0,也說明名次並不是按順序輸出的。因此整個程式的**應該是這樣的:

#include

int main()

return 0;

其執行結果如下:

在這裡要注意下每次給每個名次組存放的時候,要把ret初始化,這樣就不會將上次的值再傳遞到這次。

在VS中進行對專案進行編譯出現不能編譯的問題

在用 vs工具開發的 asp.net 應用程式時,有時會出現c windows microsoft.net framework v2.0.50727 temporary asp.net files這個資料夾的 csc.exe 編譯應用程式已存在還是什麼,該應用程式就是編譯不過去一直報這個錯誤。解決辦...

ES編譯出來為snapshot版本的解決辦法

es 的編譯命令如下 gradlew assemble命令編譯出來的包預設是帶有 snapshot 字尾的,這種快照版本的的es 安裝包,部署起來可能會有問題。比如,當想要獲取es版本號的時候,es會報錯 illegal version format snapshots are only suppo...

如何看檔案是否是交叉編譯出來的

h是我用gcc o h hello.c 來編譯的 root boy desktop home boy workplase file h h elf 32 bit lsb executable,intel 80386,version 1 sysv dynamically linked uses sha...