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;//本次删除后的下一个位置就是开始位置 //但是开始位置不一定是有效数字 }