猴子选大王(顺序表)

[程序代码]

#include<stdio.h>
#include<stdlib.h>

/* 函数原型 */
void Init(struct monkey *p, unsigned long n);
unsigned long Game(struct monkey *p, unsigned long k, unsigned long n);
void show(struct monkey *p, unsigned long num);

/* 记录每只猴子的信息 */
struct monkey
{
    /* 猴子的编号 */
    unsigned long number;
    /* judge == 1: 猴子还在圈中 */
    /* judge == 0: 猴子已经出圈 */
    char judge;
};

int main()
{
    /* 猴子数量 */
    long num;
    /* 数到k的猴子出圈 */
    long k;
    /* 增加输入容错机制 */
    while(scanf("%ld%ld", &num, &k) != 2 || num < 1 || k < 1)
    {
        while(getchar() != '\n') ;
    }
    /* 开辟猴子数组空间 */
    struct monkey *p = (struct monkey* )malloc(num * sizeof(struct monkey));
    /* 注意开辟连续存储空间必须在主函数中进行 */
    /* 如果在主函数中只是声明指针变量p, 而在Init函数中开辟连续存储空间, 程序将无法正常执行 */
    /* 初始化猴子数组 */
    Init(p, num);
    /* 输出猴子的信息 */
    /* show(p, num); */
    /* 开始猴子出圈游戏 */
    printf("%lu\n", Game(p, k, num));
    /* */
    return 0;
}

/* 初始化猴子数组, n为猴子的数量 */
void Init(struct monkey *p, unsigned long n)
{
    unsigned long i = 0;
    while(i < n)
    {
        (p + i) -> number = i + 1;
        (p + i) -> judge = 1;
        i ++;
    }
    /* printf("初始化成功.\n"); */
}

/* 输出所有猴子的信息, num为猴子的数量 */
void show(struct monkey *p, unsigned long num)
{
    unsigned long i = 0;
    printf("猴子编号  是否在圈内\n");
    while(i < num)
    {
        printf("%5lu           %d\n", (p + i) -> number, (p + i) -> judge);
        i ++;
    }
}

/* 数到k的猴子出圈, 确定圈中所剩的最后一只猴子的编号 */
/* n为游戏开始前圈内猴子的数量 */
unsigned long Game(struct monkey *p, unsigned long k, unsigned long n)
{
    unsigned long i = 1;
    unsigned long m = n;
    struct monkey *q = p;
    while(n > 1)
    {
        //printf("1 ");
        /* 只要圈中还有2只猴子及以上, 游戏就继续下去 */
        if(q -> judge == 0)
        {
            /* 当前q指针所指猴子已经出圈 */
             /* 猴子指针后移 */
            if(q - p == m - 1)
            {
                /* 当前猴子已是最后一只, 下次应从表头开始 */
                q = p;
            }
            else
            {
                /* 当前猴子不是最后一只, q指针后移即可 */
                q ++;
            }
            continue;
        }
        /* */
        if(i == k)
        {
            /* 当前q指针所指猴子出圈 */
            q -> judge = 0;
            /* 猴子数量-1 */
            n --;
            /* 报数值重新置1, 为下只猴子报数做准备 */
            i = 1;
        }
        else
        {
            /* 报数值+1, 为下只猴子报数做准备 */
            i ++;
        }
        /* 猴子指针后移 */
        if(q - p == m - 1)
        {
            /* 当前猴子已是最后一只, 下次应从表头开始 */
            q = p;
        }
        else
        {
            /* 当前猴子不是最后一只, q指针后移即可 */
            q ++;
        }
    }
    /* 寻找圈内所剩的最后一只猴子 */
    q = p;
    while(1)
    {
        if(q -> judge == 1)
        {
            return q -> number;
        }
        q ++;
    }
}

[运行结果]

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,我可以给你讲一下猴子选大王问题的 Python 链表版实现。 猴子选大王问题,也称为约瑟夫问题,是一个经典的数学问题。问题的描述是:n 只猴子围成一圈,按顺序从 1 到 n 编号。从第 1 只猴子开始报数,报到 m 的猴子出圈,下一只猴子继续从 1 开始报数,直到最后只剩下一只猴子。那么这只猴子就是大王。 链表是一种常用的数据结构,可以用来解决这个问题。我们可以使用 Python 的链表实现来模拟这个过程。 首先,我们需要定义一个 Node 类来表示链表中的节点。节点应该包含两个属性:value 表示节点的值,next 表示指向下一个节点的指针。 ```python class Node: def __init__(self, value): self.value = value self.next = None ``` 接下来,我们可以定义一个链表类,其中包含两个属性:head 表示链表的头节点,tail 表示链表的尾节点。 ```python class LinkedList: def __init__(self): self.head = None self.tail = None ``` 对于链表的操作,我们可以定义一些方法。首先,我们可以定义一个 add_node 方法来向链表中添加节点。 ```python def add_node(self, value): new_node = Node(value) if self.head is None: self.head = new_node self.tail = new_node else: self.tail.next = new_node self.tail = new_node ``` 接下来,我们可以定义一个 remove_node 方法来从链表中删除节点。 ```python def remove_node(self, node): if node == self.head: self.head = node.next else: prev_node = self.head while prev_node.next != node: prev_node = prev_node.next prev_node.next = node.next if node == self.tail: self.tail = prev_node ``` 现在,我们可以使用链表来解决猴子选大王问题。首先,我们可以创建一个包含 n 只猴子的链表。 ```python n = 10 m = 3 monkeys = LinkedList() for i in range(1, n+1): monkeys.add_node(i) ``` 接下来,我们可以模拟猴子报数的过程。我们从头节点开始遍历链表,每次遍历到第 m 个节点时,就将该节点从链表中删除。我们重复这个过程,直到只剩下一只猴子为止。 ```python current_node = monkeys.head while monkeys.head != monkeys.tail: for i in range(m-1): current_node = current_node.next next_node = current_node.next monkeys.remove_node(current_node) current_node = next_node ``` 最后,我们可以输出最后剩下的猴子的编号,即大王的编号。 ```python print(monkeys.head.value) # 输出大王的编号 ``` 这就是猴子选大王问题的 Python 链表版实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好梦成真Kevin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值