描述
一堆猴子都有编号,编号是1,2,3 …m,这群猴子(m个)按照1~m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。利用单向循环链表模拟此过程,依次输出出圈的猴子编号。
输入
多组数据,每组数据占一行,包括两个数据m和n。m代表猴子个数,n代表步数,m=0且n=0时输入结束。
输出
依次输出出圈的猴子编号,编号之间用空格隔开。
样例输入1 复制
10 4
8 3
0 0
样例输出1
4 8 2 7 3 10 9 1 6 5
3 6 1 5 2 8 4 7
其中有几点错误,这些错误应该在仔细分析后找到,但是自己总是异想天开。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define OK 1 using namespace std; typedef struct { int id; }Houzhi; typedef struct LNode { Houzhi data; struct LNode *next; }LNode,*LinkList; LinkList L; bool InintList(LinkList &L) { L=new LNode; L->next=NULL; return OK; } int main() { int n;//猴子数 int m;//步数 while(scanf("%d%d",&n,&m)) { InintList(L); L->next=new LNode; LNode *p=L->next; LNode *pre=L; if(n==0&&m==0) { break; } else { for(int i=1;i<=n;i++)//循环链表建立 { p->data.id=i; p->next=new LNode; p=p->next; pre=pre->next; } pre->next=L; //连接 } int num=0; LNode *p2=L; LNode *pre2=pre; //尾节点 while(L!=L->next) //循环条件 { for(int i=1;i<=m;i++) { p2=p2->next; if(pre2->next!=p2) //这个一定要判断,不然在删除结点后,pre2会和p2重叠 pre2=pre2->next; if(p2==L) //头节点的原因 { p2=p2->next; pre2=pre2->next; } } num++; if(num<n) cout<<p2->data.id<<" "; else if(num==n) { cout<<p2->data.id<<endl;//这个endl易掉,不然过不了 } pre2->next=p2->next; } } return 0; }
|