编程题: 1.设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。

/**
 *  编程题: 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容