约瑟夫环
程序员文章站
2022-04-24 14:05:49
...
约瑟夫环
代码:
#include <stdio.h>
#define MAXN 20
void CountOff( int n, int m, int out[] );
int main()
{
int out[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
CountOff( n, m, out );
for ( i = 0; i < n; i++ )
printf("%d ", out[i]);
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
#include <string.h>
void CountOff( int n, int m, int out[] )
{
int go[n]; //判断是否走了,走了为1,没走为0
memset(go,0,sizeof(go));
int cnt = 0; //当前人报的数
int goCnt = 1; //记录走了几个
int i = 0; //人数编号循环
while (1)
{
if (go[i] == 0)
{
cnt++;
here:if (cnt == m && go[i] == 0) //报了指定的数字,并且还没有走
{
out[i] = goCnt;
goCnt++;
cnt = 0;
go[i] = 1;
}
else if (go[i] == 1) //已经走了,则继续下一个人判断
{
i++;
goto here;
}
}
if (goCnt == n+1) //如果总共走的超过总人数,结束循环
{
break;
}
i++; //人数编号+1,如果超出了总共的人数,编号会到第一个人,即编号下标为0
if (i == n)
{
i = 0;
}
}
}
------------------------------------------------------------------------------------------------
例题2:
代码:
代码思路:yyt
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n,m;
scanf("%d %d", &n, &m);
//把人的编号由1到n排好
int man[n];
for (int i = 0; i < n; i++)
{
man[i] = i+1;
}
int putOut[n]; //用于输出的数组
int go = 0; //走了几个人
int num = 1; //报的数
while (go < n)
{
for (int i = 0; i < n; i++)
{
if(*(man+i) != -1)
{
if (num == m)
{
putOut[go] = *(man+i);
go++;
num = 0;
*(man+i) = -1;
}
num++;
}
}
}
for (int i = 0; i < n; i++)
{
printf("%d ",putOut[i]);
}
return 0;
}
上一篇: SpringCloud