题目:n个人编号分别是1,2,3,...,n,围坐在一张圆桌周围,从编号为k的人开始报数,数到m的人出列。然后他的下一个人开始报数,数到m的那个人又出列;依次循环,直到所有人出列。
struct LNode{
int data;
LNode *next;
};//n为总人数,k为第一个开始报数的人,m为出列者喊到的数
void solve(int k,int m, int n)
{
if(k>n || n<=0 || m<=0)
{
throw "Invalid argument(s)";
}//建立循环链表
LNode *p = new LNode;
p->data = 1;
p->next = p;LNode *curr = p;
for(int i=2;i<=n;i++)
{
LNode *q = new LNode;
q->data = i;
p->next = q;
q->next = curr;
p=p->next;
}//把当前指针移动到第一个报数的人
while(--k)
{
curr = curr->next;
}
LNode *pre;
int m1=m;
while(n--)
{
while(--m1)
{
pre = curr;
curr = curr->next;
}
m1 = m;
cout<<curr->data<<" ";
pre->next = curr->next;
delete curr;
curr = pre->next;
}}
int main()
{
solve(2,2,4);
return 0;
}
注意:while(k--)比while(--k)多循环一次,在循环体中k值大小相同。