题解 | 约瑟夫环
约瑟夫环
https://www.nowcoder.com/practice/e417cfe32c74416ca38247f619ddb322
#include <stdio.h>
#include <stdlib.h>
int main() {
int n,k,m;//k为编号,m为报数
int cnt = 0;//cnt ? m
scanf("%d %d %d",&n,&k,&m);
int length = n;
//终止条件 length=1 k = % n
int *number = (int*)malloc(sizeof(int)*n);
int i;
for(i=0;i < n;i++){
number[i] = i;
}//给队列赋予初值
for(i = k;;i = (i+1)%n){
if(length == 1) break;
if(number[i] != -1 ) cnt++;
if(cnt == m){//需要人出列
number[i] = -1;
length = length - 1;
cnt = cnt - m;
}
}
for(i = 0;i < n;i++){
if(number[i]!=-1)
printf("%d",number[i]);
}
return 0;
}
查看19道真题和解析