1. 程式人生 > >(程式設計師面試寶典)已知n個人圍坐在一張圓桌旁,從編號為k的人開始..................

(程式設計師面試寶典)已知n個人圍坐在一張圓桌旁,從編號為k的人開始..................

【題目】

設有n個人(以編號為1,2,3…….n分別表示)圍坐在圓桌周圍,從編號為k的人開始報數,數到m的人就站出來,他的下一個人又從1開始報數,數到m的人就站出來,依此規律重複下去,知道全部的人都站出來為止。

【程式碼實現】

這裡選擇迴圈連結串列作為資料結構。

#include<iostream>
using namespace std;
struct node
{
  int data;
  node *next;
};
class linklist
{
public:
     linklist() //利用建構函式對迴圈連結串列進行初始化
     {
       node *p=new
node(); p->data=1; p->next=p; first=p; }; void josephus(int n,int k,int m); private: node *first; }; void linklist::josephus(int n,int k,int m) { node *q=first; for(int i=2;i<=n;i++) //建立迴圈連結串列(編號為1,2,3..........N) { node *p=new node(); p->data=i; p->next=q->next; q->next=p; q=p; } //---------找到第一個報數的人,p記錄當前報數的位置,r為報數的前一個位置----------
node *p=first; node *r; while(--k) { r=p;; p=p->next; } //----------把這n個元素依次出列-------- cout<<"n個元素依次出列:"; while(n--) { for(int s=1;s<m;s++) //從當前元素開始報數,報數為m的元素出列,p指向出列元素 { r=p; p=p->next; } r->next=p->next; cout
<<p->data<<" "; p=r->next; //此時p指向被刪元素的下一個元素 } cout<<endl; } int main() { linklist L; L.josephus(9,1,5); system("pause"); return 0; }

【執行結果】

這裡寫圖片描述

相關推薦

no