C 约瑟夫环[数组]

#include <stdio.h>
#define N 30
int out(int str[], int start, int counts);
int main() {
    int str[30];
    int i = 0;
    for (; i < 30; i++) {
        str[i] = i + 1;
    }

    //    printf("%d,\n", out(str, 0, 9));//10 //ok
    int rest = 30;
    int start = 0;
    while (rest > 15) {
        start = out(str, start, 9);
        rest--;
    }
    return 1;

}

/**
 * 返回下一次开始的下标
 */
int out(int str[], int start, int counts) {
    int i = start;//起始位置  经过一些删除 起始位置不一定是有效数字
    int number = 0;//有效数字

    if(str[i]!=-1){
        number=1;
    }
    while (number < counts) {
        //移动
        if (i > N - 1) {
            i = i - N;
        }
        i++;
        if (str[i] != -1) {
            number++;
        }
    }
    int temp = str[i];
    str[i] = -1;
    printf("start:%d killI:%d  val %d\n", start, i, temp);
    return i + 1;//本次删除后的下一个位置就是开始位置  //但是开始位置不一定是有效数字
}
原文地址:https://www.cnblogs.com/cart55free99/p/2981420.html