n个人围成一个圈,每个人分别标注为1、2、…、n,要求从1号从1开始报数,报到k的人出圈,接着下一个人又从1开始报数,如此循环,直到只剩最后一个人时,该人即为胜利者。例如当n=10,k=4时,依次出列的人分别为4、8、2、7、3、10,9、1、6、5,则5号位置的人为胜利者。给定n个人,请你编程计算出最后胜利者标号数。
第一行为人数n;
第二行为报数k;
Input
10
4
Output
5
这里采用链表模拟的方法来实现:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef struct LNode
{
int data;
LNode *next;
}LinkList;
void InitList(LinkList *&L)//初始化链表,头结点赋空
{
L=(LinkList*)malloc(sizeof(LinkList));
L->next=NULL;
}
void CreatList(LinkList *&L,int n)
{
int i;
LinkList *p,*q;
q=L;
for(i=1;i<=n;i++)
{
p=(LinkList*)malloc(sizeof(LinkList));
p->data=i;q->next=p;
p->next=NULL;
q=p;
}
q->next=L->next;//用循环链表来实现
}
int solve(LinkList *L,int n,int k)
{
LinkList *t;
int index=1;
t=L->next;
while(t->next!=t)//当剩下最后一个人的时候出循环
{
index++;
if(index==k)//数到第k个人,将它移出链表
{
index=1;
//cout << t->next->data <<" ";
t->next=t->next->next;
}
t=t->next;
}
return t->data;
}
int main()
{
LinkList *L;
InitList(L);
int n,k;
cin >> n >> k;
CreatList(L,n);
int index = solve(L,n,k);
cout << index;
return 0;
}
理解循环链表后应该不难实现,祝大家AC快乐