約瑟夫環問題:有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;
}
輸出結果如下圖: