n只猴子选猴王,n的范围是13到1000,选法如下:将n只猴子从1到n编号,排成圆圈,从1号开始数,每数到13,该猴出列,如此循环,当圈中猴子数只剩两只时,数1的为猴王,用c语言编程输出王的编号。
时间: 2024-06-13 17:08:19 浏览: 14
以下是C语言的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, m = 13, i, s = 0;
scanf("%d", &n);
int *a = (int *)malloc(n * sizeof(int));
for (i = 0; i < n; i++)
{
a[i] = i + 1;
}
while (n > 2)
{
for (i = 0; i < n; i++)
{
if (a[i] != 0)
{
s++;
if (s == m)
{
a[i] = 0;
s = 0;
n--;
}
}
}
}
for (i = 0; i < n; i++)
{
if (a[i] != 0)
{
printf("%d\n", a[i]);
}
}
free(a);
return 0;
}
```
相关问题
用c语言实现,n只猴子选猴王,选法如下,将n只猴子从1到n编号排成一个圆圈,从1号猴子开始秋数,每数到13猴子出列,如此循环往复,到圈子只剩两只时,数1的那个猴子就是猴王,编程输出猴王的13~1000
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int num;
struct node *next;
} Node;
int main() {
int n = 1000; // 猴子总数
int m = 13; // 数到m的猴子出列
int i, j;
Node *head, *p, *q;
head = (Node *) malloc(sizeof(Node));
head->num = 1;
p = head;
for (i = 2; i <= n; i++) {
q = (Node *) malloc(sizeof(Node));
q->num = i;
p->next = q;
p = q;
}
p->next = head; // 链接成一个环
for (i = 1; i < n; i++) {
for (j = 1; j < m; j++) {
p = p->next;
}
printf("%d ", p->next->num);
p->next = p->next->next; // 删除p的下一个节点
}
printf("\n%d\n", p->num); // 输出最后一个节点,即猴王
return 0;
}
```
--相关问题--:
1. 如何用C语言实现约瑟夫环问题?
2. 请介绍一下
n只猴子选猴王,将猴子们从1到n编号并排成一个圆圈,从一号猴子开始数,每数到13的猴子就出列,如此循环,直到圈中的猴子只剩两只,序列靠前的那一只为猴王,n的取值为13到1000
这是一个经典的约瑟夫问题,可以使用递归或循环来解决。具体解法如下:
1. 递归解法:
定义一个函数f(n,m),表示n只猴子选出猴王的过程中,每数到m的猴子出列后剩下的猴子选猴王的过程。则有以下递推公式:
f(n,m) = (f(n-1,m)+m)%n (n>1)
f(1,m) = 0
其中,f(1,m)表示只有一只猴子时,它自己就是猴王,编号为0。
最终,当n只猴子选出猴王时,编号为f(n,m)+1的猴子就是猴王。
2. 循环解法:
定义一个数组a[n],表示第i只猴子是否还在圈中。初始时,所有猴子都在圈中,即a[i]=1。然后按照题目要求,每数到第13只猴子就将其从圈中删除,即a[i]=0。直到圈中只剩下两只猴子时,序列靠前的那一只为猴王。
具体实现过程如下:
```python
n = 1000
m = 13
a = [1] * n
cnt = n # 记录圈中还剩下的猴子数
i = 0 # 当前数到的猴子编号
while cnt > 2:
j = 0 # 记录当前数到的第几只猴子
while j < m:
if a[i] == 1:
j += 1
if j == m:
a[i] = 0
cnt -= 1
i = (i+1) % n
while a[i] == 0:
i = (i+1) % n
print(a.index(1)+1, (a.index(1)+1)%n+1)
```
最终,输出的结果为序列靠前的那一只猴子的编号和它旁边的猴子的编号,即为猴王和副王。