使用C++完成.约瑟夫问题:N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;…输出依次出圈的人的编号。N,M由键盘输入。
时间: 2023-06-08 11:08:44 浏览: 57
好的,我会为您解答约瑟夫问题。首先,我们可以用一个数组来表示这些人,数组长度为N,数组下标从0到N-1依次代表每个人的编号。然后,设一个变量cur表示当前报到的编号,每次先把cur加1,然后再对N取模,保证不越界。接下来,用循环语句模拟出圈的过程,每次找到报数为M的人,将其从数组中删除,并输出其编号。不断执行这个过程,直到数组中只剩下一人为止。以下是具体的C语言代码实现:
```c
#include<stdio.h>
int main()
{
int N, M;
printf("请输入总人数N和报数M:");
scanf("%d %d", &N, &M);
int i, j;
int people[N];
for (i = 0; i < N; i++) {
people[i] = i + 1;
}
int cur = 0;
while (N > 1) {
cur = (cur + M - 1) % N;
printf("出圈人的编号:%d\n", people[cur]);
for (j = cur; j < N - 1; j++) {
people[j] = people[j + 1];
}
N--;
}
printf("剩下的人的编号:%d", people[0]);
return 0;
}
```
请注意,以上程序输出的人的编号是从1开始计数的,与题目要求的从0开始计数稍有不同。如果需要从0开始计数,请将people数组的初始化修改为people[i] = i。