跳转到主内容
思享编程网:思考分享,玩转编程世界!

C++编程挑战:如何找出猴王的位置?

大家好,我是陆砚码。今天我们来解决一个有趣的C++编程问题:n只猴子围成一圈,顺时针方向从1到n编号。接下来,从1号开始,猴子们依次报数,报到m的猴子就会被淘汰。这个过程一直进行,直到只剩下一只猴子,它就是猴王。那么,这个猴王原来的编号是几呢?

核心思路

这个问题可以通过模拟猴子报数的过程来解决。我们可以使用一个循环链表来表示猴子围成的圈,然后依次移除报数为m的猴子,直到只剩下一个猴子。

/* 邵发, 1309班,  */

/*
作业07, 练习2

n只猴子围成一圈,顺时针方向从1到n编号。之后从1号开始顺时针方向让猴子从1到m依次报数,
凡报到m的出圈,取消资格。下一位再从1开始依次报数,
报出m者出圈,最后剩下的就是猴王。问这个猴王原序排在第几位。
*/

#include 
#include 

// 成员结点
typedef struct __Node
{
    int id;
    struct __Node* next; 
}
Node;

int Play(int n, int m)
{
    // 链表长度:n
    // 构造循环链表
    Node* lst = (Node*)malloc(sizeof(Node)*n);
    int i;
    for(i=0; inext = cur->next;
            cur = cur->next;
        }
        else
        {
            // 下一位
            prev = cur;
            cur = cur->next;
        }
    }

    // 剩下的是胜者
    int winner = cur->id;
    free(lst); // 释放内存
    return winner;
}

int ex07_02()
{
    int winner = Play(5, 2);
    printf("winner is %d . 
", winner);
    return 0;
}

总结

通过这个例子,我们学习了如何使用循环链表来模拟猴子报数的过程,并找出最后的猴王。这个问题的解决方法也可以应用到其他类似的场景中。

如果你对编程有更多的疑问或者想学习更多的编程知识,欢迎访问我们的网站「思享编程网」(www.sxgpb.com)。

相关文章