程序:
int Josephus_problem(int n)
{
#define DANGER 3//定义一个宏,3,(危险数3)
int* arr = (int*)malloc(n * sizeof(int));//动态申请一维数组
for (int i = 0; i < n; i++)//初始化为1
{
arr[i] = 1;
}
int tmp = n;//幸存人数
int count = 0;//报的号
while (tmp > 1)//while循环终止条件是还剩1个人
{
for (int i = 0; i < n; i++)//从第一个人开始便利
{
if (arr[i] == 1)//如果值为1,说明这个人幸存
{
count++;//报的数+1
if (count == DANGER)//如果count=3,触发危险
{
arr[i] = 0;//此处的值修改为0
tmp--;//幸存数-1
count = 0;//报的号重新修改为0
}
}
}
}
for (int i = 0; i < n; i++)//对定义的一维数组,开始便利一遍
{
if (arr[i] == 1)//如果arr[i] == 1,说明第i个人幸存,返回标号i
{
return i;
}
}
return -1;
}
int main()
{
printf("%d\n", Josephus_problem(41));//调用函数求n=41时幸存人的标号
return 0;
}
结果: