美文网首页
编程题: 1.设编号为1,2,… n的n个人围坐一圈,约定编号为

编程题: 1.设编号为1,2,… n的n个人围坐一圈,约定编号为

作者: 欧币杰昔 | 来源:发表于2016-08-03 21:26 被阅读113次
/**
 *  编程题: 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];

运行结果:


Paste_Image.png

相关文章

网友评论

      本文标题:编程题: 1.设编号为1,2,… n的n个人围坐一圈,约定编号为

      本文链接:https://www.haomeiwen.com/subject/jmfcsttx.html