/**
* 编程题: 1.设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
*
* @param n n个人
* @param m 数到m那个人出列
* @param k 初始编号,第一次从这个人开始数
*/
+(void)run:(int)n andm:(int)m andk:(int)k
{
NSMutableArray *mArr = [NSMutableArray new];//原始数据数组
NSMutableArray *newmArr = [NSMutableArray new];//所有人出列后的编号顺序数组
//从k这个人开始报数,所以减1
k --;
//初始编号按顺序加入数组
for (int i = 1; i<=n; i++)
{
[mArr addObject:@(i)];
}
//循环
do {
//从1开始报数,报到m则停止
for (int j = 1; j<m; j++)
{
k++;//下一个人
//报数到最后一个人,则回到第一个人继续报
if (k>=mArr.count)
{
k=0;
}
}
//如果k(数到m的人)大于总人数,则对当前总人数取余
if (k>mArr.count)
{
k=k%mArr.count;
}
//数到m的人加入新数组,然后出列(从原数组删除)
NSString *temp = mArr[k];
[newmArr addObject:@([temp intValue])];
[mArr removeObjectAtIndex:k];
//如果数到m的人刚好为最后一个,则k置为0(下次报数从0开始)
if (k == mArr.count)
{
k=0;
}
} while (mArr.count>0);//原始数组里面还有元素则继续循环
NSLog(@"%@",newmArr);
}
main函数里面调用:
[run run:10 andm:5 andk:2];
运行结果: