Description
n个人围成一个圈,每个人分别标注为1、2、...、n,要求从1号从1开始报数,报到k的人出圈,接着下一个人又从1开始报数,如此循环,直到只剩最后一个人时,该人即为胜利者。例如当n=10,k=4时,依次出列的人分别为4、8、2、7、3、10,9、1、6、5,则5号位置的人为胜利者。给定n个人,请你编程计算出最后胜利者标号数。(要求用单循环链表完成。)
Input
第一行为人数n;
第二行为报数k.
Output
输出最后胜利者的标号数。
Sample Input
10 4
7 3
5 2
6 7
Sample Output
5
4
3
5
void initlist(list *&l,int n)
{
list *s,*p;
int i=1;
l=(list *)malloc(sizeof(list));
s=l;
for(;i<=n;i++)
{
p=(list *)malloc(sizeof(list));
p->data=i;
s->next=p;
s=p;
}
s->next=l;
}
void winlist(list *&l,int n,int k)
{
int i=0,j=0;
list *p=l;
for(;;)
{
p=p->next;
if(p==l)
p=l->next;
if(p->data!=0)
j++;
if(j==k)
{
j=0;
if(p->data==0)
p=p->next;
i++;
if(i==n)
{
cout<<p->data;
break;
}
p->data=0;
}
}
}int main()
{
int n,k;
cin>>n;
list *l;
initlist(l,n);
cin>>k;
winlist(l,n,k);
destroylist(l);
return 0;
n个人围成一个圈,每个人分别标注为1、2、...、n,要求从1号从1开始报数,报到k的人出圈,接着下一个人又从1开始报数,如此循环,直到只剩最后一个人时,该人即为胜利者。例如当n=10,k=4时,依次出列的人分别为4、8、2、7、3、10,9、1、6、5,则5号位置的人为胜利者。给定n个人,请你编程计算出最后胜利者标号数。(要求用单循环链表完成。)
Input
第一行为人数n;
第二行为报数k.
Output
输出最后胜利者的标号数。
Sample Input
10 4
7 3
5 2
6 7
Sample Output
5
4
3
5
void initlist(list *&l,int n)
{
list *s,*p;
int i=1;
l=(list *)malloc(sizeof(list));
s=l;
for(;i<=n;i++)
{
p=(list *)malloc(sizeof(list));
p->data=i;
s->next=p;
s=p;
}
s->next=l;
}
void winlist(list *&l,int n,int k)
{
int i=0,j=0;
list *p=l;
for(;;)
{
p=p->next;
if(p==l)
p=l->next;
if(p->data!=0)
j++;
if(j==k)
{
j=0;
if(p->data==0)
p=p->next;
i++;
if(i==n)
{
cout<<p->data;
break;
}
p->data=0;
}
}
}int main()
{
int n,k;
cin>>n;
list *l;
initlist(l,n);
cin>>k;
winlist(l,n,k);
destroylist(l);
return 0;
}