问题描述:
有n个人围城一圈,并从1到n编号,从第m个人开始报数,报到k的人出圈,下一个人继续从1开始报数,再报到k的人出圈,直到最后只剩下一个人。问最后剩下的这个人是几号。
分析:
- 用数组来存储每个人的编号,a[0]=1,a[1]=2,。。。,a[n-1]=n。
- 定义出圈人数为outCircle,每出圈一个人,outCircle++,当outCircle=n-1时,说明就剩下一个人了。
- 怎么定义出圈?当有人要出圈时,便把他的编号置为0,不再参与报数。
- 定义count变量作为计数器,每次出圈一人,count++;
- 当count==k时,则出圈一个人,count=0,重新计数;
int getLastOne(int n,int start,int target)
{
int *array=new int[n];
int count=0;//报数
int outCircle=0;//出圈人数
//首先给圈内人编号
int i;
for (i=0;i<n;i++)
{
array[i]=i+1;
}
//循环报数,第3个人数出圈,将出圈的人的编号置为0;
i=start-1;
while (outCircle<n-1)//当outCircle=n-1,即圈内只剩下一个人时,跳出循环
{
if (array[i]!=0)//开始报数
{
count++;
if (count==target)//则这个人出圈
{
array[i]=0;
outCircle++;//圈外人数加1
count=0;//重新报数
}
}
i++;
if (i==n)//如果到最后一个人,则重新开始
i=0;
}
for (i=0;i<n;i++)
{
if (array[i]!=0)
{
return array[i];
}
}
}