多人圍成一圈報數問題!

2021-06-26 08:49:29 字數 1386 閱讀 7076

題目(摘自譚浩強的c語言):有n個人圍成一圈,順序排號。從第乙個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下的是原來第幾號的那個人。

解法思路:首先不要將思維侷限在一圈人,可以先將n個人看做一排,即作為乙個陣列,為這個陣列的每乙個元素(即人)編號,第0個人就編號1,以此類推。有了編號之後可以這樣:讓第乙個人開始報數,到第三個人喊3的時候,將其編號重置為0,並且將喊的那個數重置0(即讓下乙個人喊的時候又從1開始),如此這麼迴圈(迴圈的條件就是留下的人至少為乙個)。有一點要注意的就是,當指標訪問到最後乙個人的時候,由於題目要求是圍成一圈,而我們這裡是一排,所以要重置指標,使其指向排頭。

**如下:

[cpp]view plain

copy

print?

#include 

void

main()  

i=0;//i用於計數,即讓指標後移

m=0;//m記錄退出圈子的人數

k=0;//k報數1,2,3

while

(m//當退出的人數不大於總人數時,即留下的人數至少是乙個人

//這句不能寫成m

//這時是7<8,剩下的乙個人自己喊1,2,3那麼他也就退出了,將不會有輸出

if(k==3)  

i++;      //指標後移

if(i==n)

//這句很關鍵,如果到了隊尾,就要使指標重新指向對頭

//並且它只能放在i++後面,因為只有i++了才有可能i==n

}  printf("現在剩下的人是:"

用鍊錶實現上面的演算法:

[cpp]view plain

copy

print?

#include 

#define n 13    //定義人數

struct

person  

link[n+1];//陣列長為n+1方便編號

void

main()  

h=n;  

printf("離開的人是:"

);  

while

(count

printf("%3d"

,link[h].num);  

link[h].num=0;//喊3的人編碼賦值為0

count++;  

}  printf("最後剩下的人是:\n"

);  

for(i=1;i<=n;i++)  

}  

n人圍成一圈報數問題

題目 有n個人圍成一圈,順序排號。從第乙個人開始報數 從1到3報數 凡報到3的人退出圈子,問最後留下的是原來第幾號的那位。思路 假如是8人,則需要乙個陣列將8個人的從1到8依次記下每人位數,還需要乙個模擬報數口令的變數該變數最初為0,從1到2在到3,當該變數為3時,此時對應編號的人就要退出 那麼第一...

助教c c n個人圍成一圈報數問題

以下三個問題都屬於同型別的問題,其中兩道題目是助教時的實驗題,還有一道是華為在成都招聘時的機試題目。在這三個問題中,問題1考慮的最簡單,用指標實現 問題2考慮最全面,用結構體實現 問題3用到了函式。問題1 有n個人圍成一圈,順序排號。從第乙個人開始報數,凡報到3的人退出圈子,問最後留下的是幾號?源程...

C語言 N個人圍成一圈報數淘汰問題

一 問題描述 有17個人圍成一圈 編號為0 16 從第 0號的人開始從 1報數,凡報到 3的倍數的人離開圈子,然後再數下去,直到最後只剩下乙個人為止。問此人原來的位置是多少號?二 問題解決 1.定義陣列記錄每個編號的狀態 是否被淘汰 2.在未被淘汰的人中檢查是否數到3,若是,淘汰此人 3.繼續此過程...