约瑟夫环问题:有n个人围成一圈,顺序排号,从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位
考点1:标记数组
考点2:环形处理
考点3:循环结束条件
#include <iostream>
int JosephProblem(int n)
{
int *arr = (int *)malloc(n*sizeof(int));//标记
int i;
for(i=0;i<n;i++)
{
arr[i] = 1;//参与游戏
}
int count = n;//还在参与游戏的人数
int tmp = 0;//报数器
i = 0;
while(count>1)
{
if(arr[i]==1)//还在参与游
{
tmp++;
if(tmp==3)//他需要退出游戏
{
arr[i] = 0;
tmp = 0;
count--;
}
}
//i++;//越界
i = (i+1)%n;//环形处理
}
for(i=0;i<n;i++)
{
if(arr[i]==1)
break;
}
free(arr);
return i+1;
}
int main()
{
for(int i=1;i<5;i++)
{
printf("%d\n",JosephProblem(i));
}
return 0;
}
输出结果如下图: