思路:
1. 用数组模拟,将数组前n个元素初始化1,代表存活状态,用0代表被淘汰的。
2.如何循环?共n个人,淘汰掉n-1个人就循环结束,即:用count记录已淘汰(0)的人数 ,如果n>=count,就结束循环。
3. 如何淘汰?用num记录遍历过的存活(1)的个数,每遍历三个就淘汰第三个,并将其状态设置为0。
#include<stdio.h> //约瑟夫环问题 :数组模拟实现
int main(){
printf("10人报数,报到3的退出\n");
int n=10,count=0; //count 用于记录已淘汰(0)的人数
int num=0; //num用于记录遍历的存活(1)的个数
int status[100];
//先初始化数组 全标记成1,代表存活状态
for(int i=1;i<=n;i++)
status[i-1]=1;
while(count<n){
for(int j=1;j<=n;j++){
if(status[j-1]==1)
num++; //每遍历三个1就淘汰第1
if(num==3){
if(status[j-1]!=0)
printf("%d ",j); //输出淘汰的序号
status[j-1]=0;
count++;
num=0;
}
if(count==n)
break;
}
}
return 0;
}