c语言设有n个人围成一个圈,从编号为m的人开始由1开始报数,每次正好报到数k的人退出游戏,后面一个人重新由1开始报数。请求出最后剩下的那个人的编号。
时间: 2024-05-21 08:12:16 浏览: 21
这是一个经典的约瑟夫问题,可以使用递归或数学方法来解决。以下是使用递归的解决方案:
int josephus(int n, int k, int m) {
if (n == 1) {
return (m + k - 1) % n + 1;
} else {
int new_m = (m + k - 1) % n + 1;
return josephus(n - 1, k, new_m);
}
}
int main() {
int n = 10; // n个人围成一个圈
int k = 3; // 每次报数k个人
int m = 4; // 从编号为m的人开始
int last_person = josephus(n, k, m);
printf("最后剩下的人的编号是%d\n", last_person);
return 0;
}
这个程序将输出最后剩下的人的编号是5。
相关问题
用c语言数组解决:设有n个人围成一个圈,从编号为m的人开始由1开始报数,每次正好报到数k的人退出游戏,后面一个人重新由1开始报数。请求出最后剩下的那个人的编号。
好的,理解了您的问题。这个问题其实是经典的约瑟夫问题,有一个很巧妙的解法。我们可以使用数组模拟整个游戏过程,每次删除一个人即将他所在的位置设为0,然后重新开始报数,直到最后只有一个人为止。下面是基于数组模拟的解法实现:
```
#include <stdio.h>
#define MAX_N 1000
int n, m, k, a[MAX_N + 5];
int main() {
scanf("%d%d%d", &n, &m, &k);
int cur = m - 1;
for (int i = 0; i < n; i++) {
a[i] = i + 1;
}
while (n > 1) {
int t = (cur + k - 1) % n;
a[t] = 0;
while (a[cur] == 0) {
cur = (cur + 1) % n;
}
cur = t;
n--;
}
printf("%d\n", a[cur]);
return 0;
}
```
其中,n表示总人数,m表示开始报数的人的位置,k表示每次报数的数字。cur表示当前报数的人所在的位置,t表示要删除的人所在的位置。每次删除完一个人之后,我们需要寻找下一个要报数的人,即在当前位置cur之后第一个不为0的位置。最终剩下的那个人就是当前位置cur对应的编号。
用C语言指针写一个程序:有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
好的,我来为您写一个用C语言指针实现的程序,实现你所描述的问题。
```c
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, *p, *q, *r;
printf("请输入总人数n:");
scanf("%d", &n);
p = (int *)malloc(n * sizeof(int));
q = p;
for (int i = 0; i < n; i++)
{
*(p + i) = i + 1;
}
r = p + n - 1;
while (q < r)
{
for (int i = 1; i < 3; i++)
{
q++;
if (q > r)
{
q = p;
}
while (*q == 0)
{
q++;
if (q > r)
{
q = p;
}
}
}
*q = 0;
}
while (*q == 0)
{
q++;
}
printf("最后留下的是原来的第%d号的那位\n", *q);
free(p);
return 0;
}
```
程序运行时,会先让你输入总人数n,然后依次对每个人进行编号。接着,按照题目要求,从第1个人开始依次报数,每报到3的人就退出圈子,并将其编号值设为0。程序最终输出的是最后留下的那位的编号值。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![cpp](https://img-home.csdnimg.cn/images/20210720083646.png)