约瑟夫环

来源:互联网 发布:腾跃网络 编辑:程序博客网 时间:2024/05/17 02:06

设有m个人围城一个圈,从第n个人开始报数,报到k的请出列 然后从后面一个人开始继续报数,直到剩下最后一个人。

此题有两种思路:一种是用数组,一种是用链表。由于是一个圈,因此要用到循环链表。

代码如下:

#include <iostream>using namespace std;class Node;typedef  Node *ptrToNode;class Node{public:int element;ptrToNode Next;public:Node():element(-1),Next(NULL){};};int main(void){int m,n,k;do{cin >> m >> n >> k;if( m < 0 || n < 0 || k <0 || m < n)cout << "please input m >=n >0 and  k>0" << endl;}while(m < 0 || n < 0 || m < n);cout << "m n k is " << m  << ' '<< n << ' '  << k << endl; ptrToNode begin = new Node;begin->element = 1;ptrToNode list = begin;for(int j = 2;j <= m;j++){ptrToNode next = new Node;next->element = j;list->Next = next;list = next;}list->Next = begin;//打印该链表cout << "打印该链表" << endl;ptrToNode print = begin;for(int i = 0;i < m;i++){cout << print->element << ((i + 1) % m ? ' ': '\n');//cout << print->Next << ' ';print = print->Next;}//从第n个开始数ptrToNode origin = begin;n--;while(n--){origin = origin->Next;}cout << "打印该链表" << endl;ptrToNode printn = origin;for(int i = 0;i < m;i++){cout << printn->element << ((i + 1) % m ? ' ': '\n');//cout << print->Next << ' ';printn = printn->Next;}int save[m - 1];int i = 0;ptrToNode preorigin = origin;while(i != (m - 1)){int num = k;while(--num){preorigin = origin;origin = origin->Next;}save[i++] = origin->element;preorigin->Next = origin->Next;origin = preorigin = origin->Next;}cout << "出队序号为" << endl;for(int i = 0; i < m - 1;i++)cout << save[i] << ' ';cout << "剩下的序号是 : " << origin->element << endl;} 




0 0