c语言解决约瑟夫问题数组
时间: 2023-11-12 18:03:26 浏览: 89
好的,关于约瑟夫问题,我可以给你提供一个基于数组的 C 语言解决方案。具体思路是:先创建一个长度为 n 的数组,表示有 n 个人参与游戏,然后依次将这些人编号为 1 到 n。接着,从编号为 k 的人开始报数,每报到 m 就将该人从数组中删除,直到数组中只剩下一个人为止。最后剩下的那个人即为胜者。
下面是代码实现:
```c
#include <stdio.h>
int main()
{
int n, m, k;
printf("请输入参与游戏的人数 n:");
scanf("%d", &n);
printf("请输入报数的上限 m:");
scanf("%d", &m);
printf("请输入从第几个人开始报数 k:");
scanf("%d", &k);
int a[n]; // 创建长度为 n 的数组
for (int i = 0; i < n; i++) {
a[i] = i + 1; // 将每个人的编号存入数组中
}
int count = 0; // 记录已经报数的人数
int index = k - 1; // 记录当前报数的人在数组中的下标
while (n > 1) {
if (a[index] != 0) { // 如果当前报数的人还在数组中
count++; // 已经报数的人数加一
if (count == m) { // 如果已经报数到 m
a[index] = 0; // 将该人从数组中删除
count = 0; // 已经报数的人数清零
n--; // 参与游戏的人数减一
}
}
index++; // 下一个人报数
if (index == n) { // 如果已经报数到最后一个人
index = 0; // 从第一个人重新开始报数
}
}
for (int i = 0; i < n; i++) {
if (a[i] != 0) { // 找到最后剩下的那个人
printf("胜者的编号是:%d\n", a[i]);
break;
}
}
return 0;
}
```
你可以根据需要修改代码中的变量名和注释,以便更好地理解和使用。
阅读全文