21xrx.com
2025-04-17 10:18:33 Thursday
文章检索 我的文章 写文章
C++实现约瑟夫环——数组解法
2023-07-05 12:23:08 深夜i     18     0
C++ 约瑟夫环 数组解法

约瑟夫环是一种古老的数学问题,最初是由古希腊历史学家约瑟夫斯提出的。该问题以一个基数为K的序列围成一个环,从序列中第一个人开始报数,报数为K的人被杀掉,并从下一个人重新开始报数,直到环中只剩下一人。那个幸存者即为整个序列的胜者。

在本文中,我们将介绍如何使用C++数组实现约瑟夫环的求解。首先,我们需要定义一个数组来表示约瑟夫环中的所有人。

int people[10000]; // 人数最大为10000

接下来,我们需要定义两个变量,一个用于表示当前序列中还存活的人数,另一个用于表示当前报数的位置。

int n, k; // n表示当前存活的人数,k表示当前报数的位置

然后,我们需要编写一个函数,该函数返回下一个要被杀死的人的位置。

int getNext(int start) {
  int i;
  for (i = start + 1; people[i] == 0; i++) {
    if (i >= n) i = -1; // 如果已经循环到了末尾,则重新开始
  }
  return i;
}

在这个函数中,我们使用了一个for循环来获取下一个要被杀死的人的位置。如果当前位置的人已经被杀死,则继续循环直到找到下一个存活的人。如果已经循环到了末尾,则重新开始循环。

最后,我们就可以编写主函数来解决约瑟夫环的问题了。

int main() {
  cin >> n >> k;
  for (int i = 0; i < n; i++) {
    people[i] = 1;
  }
  int cnt = 0, pos = -1;
  while (cnt < n - 1) {
    pos = getNext(pos);
    people[pos] = 0;
    cnt++;
  }
  for (int i = 0; i < n; i++) {
    if (people[i] == 1) {
      cout << i+1 << endl;
      break;
    }
  }
  return 0;
}

在主函数中,我们首先输入当前存活的人数和起始报数的位置。接着,我们使用一个for循环将所有人的初始状态设置为存活状态。

接下来,我们创建两个变量,一个用于表示当前已经杀死的人数,另一个用于表示当前要被杀死的人的位置。在while循环中,我们通过调用getNext函数获取下一个要被杀死的人的位置,并将该位置对应的人的状态设置为死亡状态。当已经杀死的人数等于n-1时,剩下的那个人就是幸存者了。

最后,我们使用一个for循环来找到数组中状态为存活的那个人,并输出这个人的位置。

这样就完成了使用C++数组实现约瑟夫环的求解。这个方法简单易懂,适合初学者练习C++编程技巧。

  
  

评论区

请求出错了