题目描述:n只猴子要选大王,选举方法如下:所有猴子按 1,2 ……… n 编号并按照顺序围成一圈,从第 k 个猴子起,由1开始报数,报到m时,该猴子就跳出圈外,下一只猴子再次由1开始报数,如此循环,直到圈内剩下一只猴子时,这只猴子就是大王。
解题思路:
1,建立循环链表并初始化。
2,使用一个计数器counter只要counter能整除m,就从链表上删除此节点,直到只剩一个节点即为所求。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
struct node
{
int date;
struct node *next;
};
int main()
{
int n,i,d;
struct node * p1,*p2,*head;
cin>>n;
if(n==1)
{
cout<<n;
return 1;
}
else
{
p1=(struct node*) malloc(sizeof(struct node));
head=p1;
p1->date=1;
for(i=2;i<=n;i++)
{
p2=(struct node*) malloc(sizeof(struct node));
p2->date=i;
p1->next=p2;
p1=p2;
}
p1->next=head;
p1=head;
cin>>d;
while(p1->next!=p1&&p2->next!=p2)
{
for(i=1;;i++)
{
if(i%d==0)
{
p2->next=p1->next;
p1=p2->next;
break;
}
p1=p1->next;
p2=p2->next;
}
}
cout<<p2->date;
}
return 0;
}