问题描述:
编号为1,2,…,n的n个人按顺时针方向围坐一圈,任选一个正整数作为报数上限m,从第一个人开始按顺时针方向从自1开始顺序报数,报道m时停止报数.报m的人出列,从他的顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列顺序.
输入输出描述:
m和n由用户输入,并且保证m和n的范围是【1,1000】,输出出列序列。
问题分析:
因为这个是要求出所有的出列序列,所以目前还没想到效率更高的方法,只能用模拟法,时间复杂度是O(m*n),设置三个变量:
index:表示目前所执行的人的号码
count:表示目前报的数是多少
OutPeopleCount:表示目前出列的人数
如果是要求出最后一个出列人的标号,请参考我的另外一篇文章:
http://blog.csdn.net/yi_ming_he/article/details/72860011
参考代码:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
int n, m, nIndex = 0, nCount = 1, nOutPeople = 0;
scanf_s("%d%d", &n, &m);
char *pIsOut = (char*)malloc(n * sizeof(char));
memset(pIsOut, 0, sizeof(char)* n);
while (1)
{
if (1 == pIsOut[nIndex])//已经out了
{
nIndex = (nIndex + 1) % n;
continue;
}
if (nCount % m == 0)
{
pIsOut[nIndex] = 1;
nOutPeople++;
printf("%d\n", nIndex + 1);
}
if (nOutPeople == n)
break;
nIndex = (nIndex + 1) % n;
nCount++;
}
free(pIsOut);
return 0;
}
运行结果: