1、无数组元素移动
说明:用count记录当前报数,用validcount记录当前有多少个有效元素。
/** * 无数组元素移动 */ void Josephus(int n, int s, int m) { int *a = (int *)malloc(sizeof(int)*n); int i = 0; for(i=0; i < n; i++) { a[i] = i; } int validcount = n; int count = 0; for(i = s -1; ; i++) { if (i >= n) { i = i % n; } if (a[i] != -1) { count++; } if(count == m) { printf("a[%d]=%d, ", i, a[i]); a[i] = -1; count = 0; validcount--; } if(validcount == 0){ break; } } }
2、有数组元素移动
说明:用count记录当前报数,用validcount记录当前有多少个有效元素。
/** * 有数组元素移动 */ void JosephusMove(int n, int s, int m) { int *a = (int *)malloc(sizeof(int)*n); int i = 0; for(i=0; i < n; i++) { a[i] = i; } int validcount = n;//总共有多少个有效元素 int count = 0; for(i = s -1; ; i++) { if (i >= validcount ) { i = i % validcount ; } count++; if(count == m) { printf("a[%d]=%d, ", i, a[i]); int j; for(j = i; j < validcount; j++){ a[j] = a[j+1]; } count = 1;//后面的元素向前移动一位,当前计数增一 validcount--;//有效元素个数减一 } if(validcount == 0){ break; } } }