Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 约瑟夫算法_C++_C_Algorithm_Josephus - Fatal编程技术网

C++ 约瑟夫算法

C++ 约瑟夫算法,c++,c,algorithm,josephus,C++,C,Algorithm,Josephus,我正在读这个算法 我遇到了以下算法: int josephusIteration(int n,int k) { int a=1; for(int i=1;i<=n;i++) { a=(a+k-1)%i+1; } return a; } 有人能举例说明吗?如果n=5和k=2,那么安全位置是3。首先,位置2的人被杀,然后位置4的人被杀,然后位置1的人被杀。最后,5号位置的人被杀。所以位置3的人活了下来 我已经阅读了您的代码,但我想建议下面的递归

我正在读这个算法

我遇到了以下算法:

int josephusIteration(int n,int k) {
    int a=1;
    for(int i=1;i<=n;i++) {
        a=(a+k-1)%i+1;
    }
    return a;
}

有人能举例说明吗?

如果
n=5
k=2
,那么安全位置是
3
。首先,位置2的人被杀,然后位置4的人被杀,然后位置1的人被杀。最后,5号位置的人被杀。所以位置3的人活了下来

我已经阅读了您的代码,但我想建议下面的递归解决方案更容易理解

// this function returns the position of the person alive
int josephus(int n, int k)
{
  if (n == 1)
    return 1;
  else
    /* The position returned by josephus(n - 1, k) is adjusted because the
       recursive call josephus(n - 1, k) considers the original position 
       k%n + 1 as position 1 */
    return (josephus(n - 1, k) + k-1) % n + 1;
}
第一个人(从一开始第k人)被杀后,剩下n-1人。所以我们调用
josephus(n-1,k)
来获得n-1人的职位

<代码>约瑟夫斯(n-1,k)< /代码>返回的位置将从位置1重新考虑。因此,我们向其添加
k-1
,并使用
n
取其模,因为存在
n
元素,并添加1以使位置
1-索引
,而不是
0-索引


参考:如果
n=5
k=2
,则安全位置为
3
。首先,位置2的人被杀,然后位置4的人被杀,然后位置1的人被杀。最后,5号位置的人被杀。所以位置3的人活了下来

我已经阅读了您的代码,但我想建议下面的递归解决方案更容易理解

// this function returns the position of the person alive
int josephus(int n, int k)
{
  if (n == 1)
    return 1;
  else
    /* The position returned by josephus(n - 1, k) is adjusted because the
       recursive call josephus(n - 1, k) considers the original position 
       k%n + 1 as position 1 */
    return (josephus(n - 1, k) + k-1) % n + 1;
}
第一个人(从一开始第k人)被杀后,剩下n-1人。所以我们调用
josephus(n-1,k)
来获得n-1人的职位

<代码>约瑟夫斯(n-1,k)< /代码>返回的位置将从位置1重新考虑。因此,我们向其添加
k-1
,并使用
n
取其模,因为存在
n
元素,并添加1以使位置
1-索引
,而不是
0-索引


参考资料:

您在理解约瑟夫斯问题时有什么问题吗?还是您特别想了解这个特定的算法。我这样问是因为它有一个更容易理解的递归解决方案。我在理解问题本身时遇到了一个问题。我的意思是为什么它一直在用%I?a代表每一次迭代吗?我代表的是从只剩下一次迭代的点向后计算的活着的人数。非递归解决方案的关键是在执行过程中向后工作。模i是因为我们在每一步都有一个圆,并计算圆周围的k个位置。“a代表将存活下来的人在圈子中的位置。”RichaTibrewal阅读下面我的答案,了解约瑟夫问题的递归解。如果你不完全理解,请告诉我。你在理解约瑟夫斯问题时有问题吗?或者你特别想理解这个特殊的算法吗。我这样问是因为它有一个更容易理解的递归解决方案。我在理解问题本身时遇到了一个问题。我的意思是为什么它一直在用%I?a代表每一次迭代吗?我代表的是从只剩下一次迭代的点向后计算的活着的人数。非递归解决方案的关键是在执行过程中向后工作。模i是因为我们在每一步都有一个圆,并计算圆周围的k个位置。“a代表将存活下来的人在圈子中的位置。”RichaTibrewal阅读下面我的答案,了解约瑟夫问题的递归解。“如果您不完全理解,请告诉我。从Geeksforgeks处复制。”BlackBird添加了参考资料。我已经添加到网站上提到的解释中。@RichaTibrewal您需要首先了解为什么我们在前面的值中添加
k-1
。然后执行
%i
以确保返回的值在[1,i]范围内。从Geeksforgeks复制。@BlackBird添加了引用。我已经添加到网站上提到的解释中。@RichaTibrewal您需要首先了解为什么我们在前面的值中添加
k-1
。然后执行
%i
,以确保返回的值在范围[1,i]内。