努力ing
你浪费的今天是昨天死去的人所渴望的明天!!!

用链表做的,其实不用链表可以做,主要是想练习一下链表的使用。

题目:

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 9
2 4 6 8 10 12 14 16 18 20 3 7 11 15 19 5 13 9
1 17
2 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<iostream>
#include<stdlib.h>
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<<a[0];
    for(i=1;i<k;i++)
        cout<<' '<<a[i];
    cout<<endl;
    s=head->next;
    cout<<s->data<<' '<<s->next->data<<endl;
    }
    return 0;
    
}

 

posted on 2013-05-12 10:25  努力ing  阅读(283)  评论(0编辑  收藏  举报