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。
输出
输出最后胜利者的标号数。
样例输入
10 4
样例输出
5
#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct CirLNode
{
int date;
CirLNode *next;
}CirLinkNode;
void initCirLinkNode(CirLinkNode *&L)
{
L = (CirLNode*)malloc(sizeof(CirLinkNode));
L->next = NULL;
}
CirLNode* CreatCirLinkNode(CirLinkNode *&L,int n,int a[])
{
CirLinkNode *p,*head=NULL,*q;
p = (CirLinkNode*)malloc(sizeof(CirLinkNode));
for(int i=0;i<n;i++)
{
if(i==0)
{
head = p;
p->date = a[i];
}
else
{
q = (CirLinkNode*)malloc(sizeof(CirLinkNode));
q->date = a[i];
p->next = q;
p = q;
}
}
p->next = head;
return head;
}
void FindElem(CirLinkNode *&L,int i)
{
CirLinkNode *p = L,*q;
while (p->next!=p) {
for(int j=1;j<i-1;j++)
{
p = p->next;
}
q = p->next;
p->next = q->next;
free(q);
p=p->next;
}
cout<<p->date;
free(p);
}
int main(int argc, const char * argv[]) {
int n;
cin>>n;
int a[n];
for(int j=1;j<=n;j++)
{
a[j-1] = j;
}
int i;
cin>>i;
CirLinkNode *L,*p;
initCirLinkNode(L);
p=CreatCirLinkNode(L, n, a);
FindElem(p, i);
return 0;
}