已知n個人(以編號1,2,3,…,n分別表示)排成一列。第一輪從編號為1的人開始依次報數,數到2的倍數的人出列;第二輪從頭開始依次報數,數到3的倍數的人出列;第三輪再次從頭開始依次報數,數到2的倍數的人出列;第四輪從頭開始依次報數,數到3的倍數的人出列;依此規律重複下去,直到佇列中的人數不超過三個為止。要求輸出此時佇列中剩下的人在初始佇列中的編號。
乙個正整數n,表示初始人數,n≤5000。
輸出佇列中剩下的人在初始佇列中的編號,編號之間有乙個空格。
1 7 19
可以使用佇列,每次操作時對佇列中元素進行判斷,不需要捨棄的就重新加入佇列。
#include
#include
//代表人的結點
typedef
struct node
node;
//佇列
typedef
struct queue
queue;
void
initqueue
(queue*
,int);
//初始化佇列
void
enqueue
(queue*
,node*);
//進隊
void
outqueue
(queue*);
//出隊
node*
getoutqueue
(queue*);
//返回出隊結點
void
regularout
(queue*
,int
,int);
//報數出列
intcountqueue
(queue*);
//計算佇列中的人數
intmain()
for(
int i =
1; i<=num; i++
)return0;
}//初始化佇列
void
initqueue
(queue* q,
int len)
}//進隊
void
enqueue
(queue* q,node* p)
//出隊
void
outqueue
(queue* q)
//出隊並且返回出隊結點
node*
getoutqueue
(queue* q)
//報數出列
void
regularout
(queue* q,
int num,
int times)}}
//計算佇列中結點數
intcountqueue
(queue* q)
return count;
}
//錯誤示範
node* p =
(node*
)malloc
(sizeof
(node));
p = q->rear;
//編譯通過,則在debug過程**現錯誤
//正確做法
node* p = q->rear;
malloc函式是為了程式設計師能手動分配記憶體空間給指標,避免指標在宣告而未分配儲存空間(指標未指向任何一片區域)的情況下被使用,出現編譯無法查詢的錯誤。結點出隊時要將指標域清空後再入隊。它作為新結點入隊時,總是插在隊尾,並作為賦值為新隊尾,若未清空,則在利用隊尾為空條件進行遍歷佇列時,會出現死迴圈
Python 報數出圈
編寫程式,模擬報數遊戲。有n個人圍成一圈,順序編號,從第乙個人開始從1到k 假設k 3 報數,報到k的人退出圈子,然後圈子縮小,從下乙個人繼續遊戲,問最後留下的是原來的第幾號。n int input 請輸入總人數 n k int input 請規定報到數字幾的人退出圈子 k circle list ...
3 迴圈陣列實現約瑟夫(報數出圈)問題
package 資料結構 約瑟夫問題 設編號1 2 3.n的n個小孩圍坐一圈,約定編號為k的人從1開始報數,數到m的人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推 直到所有人出列位置,由此產生乙個出隊的編號序列 first指向第乙個結點 一開始的單個結點保持環形的性質 自反 新增乙...
迴圈報數問題
有n個人按照 到n編號圍成乙個圈做遊戲,從第乙個人開始從 報數,數到m的人退出遊戲,他後面的人接著重新從 開始報數 問最後剩下的人是幾號?這個問題被稱為約瑟夫 josephus 環問題。最容易想到的方法是用乙個迴圈鍊錶來模擬遊戲,直到最後只剩下1人 則可得到他的號碼 這種演算法的空間複雜度是 o n...