題目描述:
已知有n個人圍坐在一張圓桌上,編號依次為0,1,2,...n-1, 編號為n-1與編號為0的人坐在相鄰的位置。現在編號為k的人從1開始報數,數到m的那個人會退出圓桌。他的下乙個人又從1開始報數,數到m的那個人又出列。依此規律重複下去,請問最後出列的人的編號。
輸入格式:
輸入一行,包含三個整數n,k,m
輸出格式:
輸出一行,包含乙個整數
#includeusing namespace std;
struct node
;class linklist
; void josephus(int n,int k,int m);
private:
node *first;
};void linklist::josephus(int n, int k, int m)
//數到第k個節點,使其為當前節點
p = first;
node *temp = p; //這個temp初始值保證了第一次開始計數到m的第乙個元素與其後各迴圈
刪除元素起始點不一致情況下,迴圈體可正常執行。
while (--k)
p = p->next;
while (n--)
//cout << p->date<<" ";
temp->next = p->next;
p = temp->next;
} cout << p->date;
cout <> n >> k >> m;
linklist l;
l.josephus(n, k, m);
//system("pause");
return 0;
}
在網上看到其他網友的寫法:
include using namespace std;
struct mynode
int m_data;
mynode *m_pnext;};
class josephus
protected:
void createlist();
void outputlist();
private:
mynode *m_phead;//迴圈鍊錶的頭節點
int m_n; //鍊錶節點個數
int m_k; //第乙個報數人的序號
int m_m; //報數出局的數
};void josephus::createlist()
cur->m_pnext = m_phead;
int n=m_n;
p = m_phead;
while (n--)
cout << endl;}
void josephus::outputlist()
while (m_n--) //輸出鍊錶中所有的節點值
mynode *p = cur;
cout << p->m_data << ",";
cur = cur->m_pnext; //刪除節點的過程
pre->m_pnext = cur;
delete p;
p=null;
}} int main()
約瑟夫環(陣列實現)
有 m 個人,每次數 n 個殺死,問從第幾個開始數可以保證第乙個人活到最後。include define ll long long define inf 0x3f3f3f3f define endl n using namespace std const int n 1e6 100 int a n ...
約瑟夫環的陣列實現
約瑟夫環的陣列實現約瑟夫 josephus 問題是由古羅馬的史學家約瑟夫提出的,他參加並記錄了公元66 70 年猶太人反抗羅馬的起義。約瑟夫作為乙個將軍,設法守住了裘達伯特城達47 天之久,在城市淪陷之後,他和40 名將士在附近的乙個洞穴中避難。在 將士們群情激奮並表示 要投降毋寧死。於是,約瑟夫建...
約瑟夫環之基於陣列
移動元素 只需要將前面的元素覆蓋 要移動的開始位置 移動的最後乙個位置 private static void moveitem int arr,int start,int stop public static void main string args 當前要 踢出 的元素 int now 0 i...