A - 链表训练之约瑟夫环
Description
一天粒粒想到我们实验室玩个小游戏!n个人围成一圈!一起报数!报到第m的时候!那个报m的退出!又从1开始报!依次类推!只到剩下一个人为止!ACMer丹丹想知道那些位置的人依次退出!ACMer抛抛想知道最后是一个人是那个位置!做为聪明的ACMer请设计一个程序告诉她们吧!(位置编号从1开始顺时针到n)
Input
输入二个数 n 和 m。
Output
输出依次退出的位置编号!每个一行!以及最后一个留下的人的位置编号!
Sample Input
1 25 3
Sample Output
131524
// File Name: 链表训练之约瑟夫环.cpp // Author: rudolf // Created Time: 2013年03月11日 星期一 19时17分09秒 #include<vector> #include<list> #include<map> #include<set> #include<deque> #include<stack> #include<bitset> #include<algorithm> #include<functional> #include<numeric> #include<utility> #include<sstream> #include<iostream> #include<iomanip> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<ctime> typedef int datatype; using namespace std; typedef struct slonode { int data; struct slonode *next; }slonode,*linklist; ////////// linklist build(linklist p,datatype num,datatype n) { // slonode *head,*p i//=head; p=(linklist)malloc(sizeof(slonode)); p->data=num; p->next=NULL; if(num!=n) p->next=build(p->next,num+1,n); return p; } int main() { int n,m; linklist p,head,q; while(cin>>n>>m) { head=build(head,1,n); // int k=0; // p=head; int now=0; while(n>0) { q=head; int k=(now+n+m-1)%n; now=k; q=head; if(k==0) { p=head; head=head->next; } else { while(k--&&k>0) q=q->next; p=q->next; q->next=p->next; } n--; printf("%d\n",p->data); free(p); } } return 0; }