題目(摘自譚浩強的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.繼續此過程...