数组实现约瑟夫问题c语言
时间: 2023-11-24 21:50:23 浏览: 101
以下是使用数组实现约瑟夫问题的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
int josephus(int n, int k) {
int i, index = 0;
int *arr = (int *)malloc(n * sizeof(int)); // 动态分配数组空间
for (i = 0; i < n; i++) {
arr[i] = i + 1; // 初始化数组
}
for (i = 0; i < n - 1; i++) {
index = (index + k - 1) % (n - i); // 计算出列的位置
printf("%d ", arr[index]); // 输出出列的元素
for (int j = index; j < n - i - 1; j++) {
arr[j] = arr[j + 1]; // 将出列的元素从数组中删除
}
}
printf("%d\n", arr[0]); // 输出最后一个元素
free(arr); // 释放数组空间
return 0;
}
int main() {
int n, k;
scanf("%d%d", &n, &k);
josephus(n, k);
return 0;
}
```
相关问题
c语言数组实现约瑟夫问题
以下是使用C语言数组实现约瑟夫问题的代码:
```c
#include <stdio.h>
#include <stdlib.h>
int josephus(int n, int k) {
int i, j = 0, m = 0;
int *p = (int *)malloc(n * sizeof(int)); // 动态分配数组空间
for (i = 0; i < n; i++) {
*(p + i) = i + 1; // 初始化数组
}
while (m < n - 1) { // 只剩一个人时退出循环
for (i = 0; i < n; i++) {
if (*(p + i) != 0) { // 找到还未出列的人
j++;
if (j == k) { // 找到第k个人
*(p + i) = 0; // 标记为已出列
j = 0;
m++;
}
}
}
}
for (i = 0; i < n; i++) {
if (*(p + i) != 0) { // 找到还未出列的人
free(p); // 释放数组空间
return *(p + i); // 返回最后一个出列的人的编号
}
}
free(p); // 释放数组空间
return 0;
}
int main() {
int n, k;
printf("请输入总人数n和出列周期k:");
scanf("%d%d", &n, &k);
int last = josephus(n, k);
printf("最后一个出列的人的编号为:%d\n", last);
return 0;
}
```
约瑟夫问题c语言数组
约瑟夫问题是一个经典的计算机科学和数学问题,也被称为约瑟夫环或丢手绢问题。在C语言中,可以使用数组来解决约瑟夫问题。上面提供的代码就是一个解决约瑟夫问题的C语言程序。该程序使用一个长度为N的数组来表示参加游戏的人员,数组中的每个元素都初始化为0,表示该成员还没有被淘汰。程序中的joseph函数模拟了约瑟夫问题的解决过程,其中使用了一个计数器count来记录已经淘汰的人数,使用一个变量k来记录每个成员报的数,使用一个变量i来表示当前轮到哪个成员报数。当一个成员被淘汰时,将其对应的数组元素置为1,表示该成员已经被淘汰。最后,程序输出的就是按照淘汰顺序排列的成员编号。
阅读全文