约瑟夫环:
知识点:
代码实现:
#import <Foundation/Foundation.h>
//从编号为k的人开始报数
#define K 1
// 数到M的人出列
#define M 4
// 总人数N
#define N 15
int main(int argc,const char * argv[]) {
// 把“人”存在一个数组里面
int p[N] = {0};
// 这个数组用来保存出列的人
int b[N] = {0};
// 定义变量
int count = 0; // 计数器 数到M个人后出列
int num = 0; // 循环结束计数器 保证N个人全出来后停止循环
int index = 0;// 定义一个变量记录存储位置
// 让人拿上个随机的编号10 ~ 100,看到这个数就代表这个人
for (int i = 0; i < N; i++) {
p[i] = arc4random() % (100 - 10 + 1) + 10;
printf("%d\t" , p[i]);
}
// 人没有出来完就一直循环
while (num < 15) {
for (int i = 0; i < N; i++) {
if (p[i] != 0) {
count++;
//如果 count = M出列,报道这个数的人出列
if(count == M){
// 将出圈的元素按序存储在b中
b[index++] = p[i + K - 1];
// 将出圈的元素赋值为 0 ; 以后不在记录
p[i] = 0;
// 将 出圈计数器count重置为0;
count = 0;
// 出列计数器 num +1;
num++;
}
}
}
}
printf("\n出列顺序为:\n------------------------------------\n");
// 打印出圈的值
for (int i = 0; i < N; i++) {
printf("%d\t" , b[i]);
}
return 0;
}