報數出列問題

2021-10-16 08:59:43 字數 1811 閱讀 3956

已知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...