网站首页 网站地图
网站首页 > 电商创业 > 有n个人围成一圈顺序排号

有n个人围成一圈顺序排号

时间:2026-03-20 02:52:54

解题思路:

初始化:

创建一个长度为n的数组,用于表示每个人的状态,初始时所有元素为`true`。

报数:

从第一个人开始,按顺序报数1到3,报数为3的人退出圈子,其对应数组元素设为`false`。

循环:

重复步骤2,直到数组中只剩下一个`true`元素。

输出结果:

最后剩下的人的原始编号即为所求。

代码示例(C++):

```cpp

include

using namespace std;

int main() {

int n;

cout << "请输入围成一圈的人数: ";

cin >> n;

bool arr[n+1]; // 创建一个布尔数组,初始化为true

for (int i = 0; i <= n; i++) {

arr[i] = true;

}

int i = 0; // 计数器,用于遍历数组

int m = 0; // 记录退出圈子的人数

while (m < n - 1) { // 当退出的人数小于总人数减1时继续循环

if (arr[i] == true) { // 如果当前位置的人未退出

m++; // 退出人数加1

if (m == 3) { // 如果退出人数达到3

arr[i] = false; // 当前位置的人退出圈子

m = 0; // 重置退出人数

}

}

i = (i + 1) % n; // 移动到下一个位置

}

// 输出最后剩下的人的原始编号

for (int i = 0; i <= n; i++) {

if (arr[i] == true) {

cout << "最后剩下的是原来的第"<< i << "号的人" << endl;

break;

}

}

return 0;

}

```

代码示例(Java):

```java

import java.util.Scanner;

public class Test {

public static void main(String[] args) {

Scanner s = new Scanner(System.in);

System.out.print("请输入排成一圈的人数: ");

int n = s.nextInt();

boolean[] arr = new boolean[n+1]; // 创建一个布尔数组,初始化为true

for (int i = 0; i <= n; i++) {

arr[i] = true;

}

int i = 0; // 计数器,用于遍历数组

int m = 0; // 记录退出圈子的人数

while (m < n - 1) { // 当退出的人数小于总人数减1时继续循环

if (arr[i] == true) { // 如果当前位置的人未退出

m++; // 退出人数加1

if (m == 3) { // 如果退出人数达到3

arr[i] = false; // 当前位置的人退出圈子

m = 0; // 重置退出人数

}

}

i = (i + 1) % n; // 移动到下一个位置

}

// 输出最后剩下的人的原始编号

for (int i = 0; i <= n; i++) {

if (arr[i] == true) {

System.out.println("最后剩下的是原来的第" + i + "号的人");

break;

}

}

}

}

```

总结:

通过上述方法,我们可以找出最后留在圈中的人的原始编号。