n个人围成一圈,初始编号从1~n排列,从第一个人开始报数,数到第m个人出圈,接着又从1开始报数,报到第m个数的人又退出圈,以此类推,最后圈内只剩下一个人,这个人就是幸运者,求出幸运者的编号。
#include<iostream>
using namespace std;
void A(int n,int m)
{
int i,k,t,num[n],*p;
p=num;
for(i=0;i<n;i++)//把n个人进行编号为1—n。
*(p+i)=i+1;
i=0;k=0;t=0;
while(t<n-1)//t为圈外人数。当t=n-1时,不再执行while循环,此时圈内还有一个人。
{
if(*(p+i)!=0)//不为零,没有出圈
k++;
if(k==m)//数到m
{
*(p+i)=0;//出圈,其值置为0。
t++;
k=0;
}
i++;
if(i==n)//数到最后一个人了,置为0继续从头数
i=0;
}
for(int i=0;i<n;i++)//查找值不为0的则为最后幸运者
{
if(*(p+i)!=0)
{
cout<<*(p+i);
}
}
return;
}
int main()
{
A(5,3);
return 0;
}