用链表做的,其实不用链表可以做,主要是想练习一下链表的使用。
题目:
description
n 个人围成一圈, 并依次编号1~n,。从编号为1 的人开始,按顺时针方向每隔一人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿。如果你想成为最后两个幸运儿,请问开始时应该站在什么位置?(设3<=n<=50) input
有多个测试序列。每行是开始时的人数n output
第1 行是选出顺序,第2 行是两名幸运儿的开始位置(按升序排列),位置编号之间用一个空格分开。
sample input
12
20
45
samlpe output
2 4 6 8 10 12 3 7 11 5
1 92 4 6 8 10 12 14 16 18 20 3 7 11 15 19 5 13 9 1 172 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 3 7 11 15 19 23 27 31 35 39 43 5 13 21 29 37 45 9 25 41 17 1 33代码:
#include#include using namespace std;typedef struct node{ int data; struct node *next;}LNode,*LinkList;int main(){ int n,i; int a[50]; while(cin>>n){ LinkList s,p,head; head=(LinkList) malloc(sizeof(LNode)); s=head; s->next=NULL; for(i=1;i<=n;i++) { p=(LinkList)malloc(sizeof(LNode)); p->data=i; s->next=p; if(i==1) head->next=p; p->next=NULL; s=p; } s=head; p=s->next; i=1; int k=0; while(head->next->next->next!=NULL) { if(p==NULL) { s=head; p=s->next; i=1; } if(i==2){ a[k++]=p->data; p=p->next; s->next=p; i=1; } else if(p!=NULL){ s=p; p=p->next; i++; } } cout< next; cout< data<<' '< next->data<