解题思路:
初始化:
创建一个长度为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; } } } } ``` 总结: 通过上述方法,我们可以找出最后留在圈中的人的原始编号。