约瑟夫环的问题,具体到某个编码来解决可谓是很多很多,这里对于约瑟夫环先打个比方:一辆小巴车被查出严重超车,最多载10人的超载至30人。于是乘客下车排成一队,排队的位置即为他们的编号。然后就是报数,从1开始,数到6的人被安排滞后乘车。如此循环,直到不超过 10 人为止,问都有哪些编号的人需要下车了,哪些编号可以乘车?当然这里只考虑仅有一辆车的情况哈,至于后续车和后续登车的问题不做考虑哈。
这里用了C的数组实现,编号和数组索引一一对应了,每次移除了的编号使用数组元素的值变为0来匹配。
#include <stdio.h>
void joseph(int* arrlist, int totalnum, int step, int staynum)
{
int i = 1;
int count = 0;
int checkcnt = 0;
while(1) {
if(1==arrlist[i])
checkcnt++;
if(checkcnt==step){
count++;
arrlist[i] = 0; /* flag = 0 */
printf("%-3d号下车了\n", i);
checkcnt=0;
}
if((totalnum-1-count)<=staynum)
break;
i++;
if(i==totalnum)
i = 1;
}
}
#define N 30+1
int main(){
int i;
int arr[N];
int cnt=0;
/* init */
printf("初始化:");
for (i=1; i<N; i++)
arr[i] = 1;
for (i=1; i<N; i++)
printf("%3d ", arr[i]);
printf("\n");
joseph(arr, N, 6, 10);
printf("编号: ");
for (i=1; i<N; i++) {
if(1==arr[i]) {
printf("%3d ", i);
cnt++;
}
}
printf("\t 留下.\n");
printf("最后留下%3d人" , cnt);
printf("\n");
return 0;
}