您的位置:首页 > 其它

约瑟夫环问题讲解

2017-08-20 18:28 113 查看

前文:

       这道题基本是大家在学习C语言路上都会碰到的一道经典例题,而且对于初学c语言者来说是一道难度不小的题,其实这道题是让我们学会标记法和如何将数组变为环状。

正文:

      我们来看问题,说有N个人围成圈,然后将它们标号从0-num,从0开始报数报到n数的人就会被杀死,然后紧接着这个死掉人的后面从0又开始报数,报到n的人同样还是被杀死,问到最后活着的那个人是原来标号为多少的。

首先我们可以把活着的人做一个标记,然后定义一个count来记录还活着的人,用一个tmp来记录他们所报的数。
下面是代码:

/*约瑟夫环
int Yuesefu(int num, int n)
{
assert(num != 0 && n != 0);
int *arr = (int *)malloc(num * sizeof(int));   //建立动态数组 来标记所有人
assert(arr != NULL);
int i=0;

for (i = 0; i < num; i++)
{
arr[i] = 1;           //先将所有人标记为1代表活着
}

int count = num;      //意味还有多少个人活着
int tmp = 0;         //这些人报的数
while (count > 1)   //直到只剩下一人,游戏一直继续
{

if (arr[i]==1)     //只有活着的人才能继续游戏
{
tmp++;       //活的人开始报数
if (tmp == n)
{
arr[i] = 0;  //报数是n的人 死亡
tmp = 0;     // 剩余的人紧接着又继续一轮从0开始报数
count--;    //死了一个人,活着的人减少一个。
}
}
i = (i + 1) % num; //将数组变成是一个环形.
}

for (i = 0; i < num; i++)
{
if (arr[i])    //找到最后活着的人在原来哪个位置
{
break;
}
}
free(arr);   //防止内存泄漏
return i;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: