6.约瑟夫环问题

                          💀来了奥💀

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LiP6YGN5LiJ5Y2B5YWt5bK4,size_19,color_FFFFFF,t_70,g_se,x_16

                    🤣又来看图来了🤣

问题描述:有n只猴子,按顺时针方向围成一圈选大王(编号为1~n),从第1号开始
圾数,一直数到m,报到m的猴子出圈,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下-  只候子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号,
输入:两个整数,第一个是n,第二个是m(0<m.n300)
输出:按出圈顺序输出猴子的编号及最后猴王的编号。
问题分析:借助数组实现,后续会使用链表给出另外一种解决方法。
(1)由于每个猴子只能是在圈内和在圈外两种状态之一,用非0表示在圈内,用0表示在圈外。使  日数组存储每个猴子的编号(假设数组名为a),初始时a[0]存放第1个猴子的编号1,则li-1]的值为第  ;个猴子的编号i,如果编号为a[i]的猴子出圈,则将其编号a[j]置成0;
(2)开始时,数组元素的值为猴子编号(1~n),n个猴子都在圈内;
(3)模拟猴子报数、出圈、选大王过程,直到圈内只剩下一个猴子为止。
算法实现:
(1)准备工作。定义大小为n的int数组a,使用循环数组模拟n个猴子围成一圈。n个猴子,下标  范围是0~n-1,a[i]存放猴子的编号计1,编号为非0表示猴子在圈内。
(2)报数过程。j为猴子的下标,j的初值应该为第1个报数猴子的前一位下标(如果从编号为1  的猴子开始报数,则j=n-1),开始报数时,计算报数猴子的下标,为了表示0下标是n-1下标的下一  个,报数时使用求余技术计算下标,即j=(j+1)%n,每次报数只数圈内的猴子,即fi[ij)kt+;(k  为计数器)。
(3)出圈。报数为m的猴子出圈,则a[j]=0;
(4)循环(2),(3),直到圈内只有一个猴子,也就是要有n-1个猴子出圈。
程序的参考代码如下:
 

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int  n,m;    //表示n个猴子,报数m
    printf("请输入猴子个数和报的数");
    scanf("%d%d",&n,&m);
    int* a=(int *)malloc(sizeof(int)*n);//动态申请储存空间
    for(int i=0; i<n; i++)
        a[i]=i+1;
    printf("出圈顺序:");
    int j=n-1;
    for(int i=1; i<n; i++)
    {//n-1个猴子出圈
        int k=0;//报数器
        do
        {

            j=(j+1)%n;//报数猴子下标
            if(a[j])
                k++;//猴子报数
        }while(k<m);
        printf("%d ",a[j]);
        a[j]=0;
    }
    printf("\n后出圈的猴子编号:");
    for(int i=0; i<n; i++)
    {
        if(a[i]!=0)
            printf("%d",a[i]);        //释放空间
    }
    free(a);
    return 0;
}

例:

7f4841e94f914d90b7084f27bef9574e.png

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LiP6YGN5LiJ5Y2B5YWt5bK4,size_19,color_FFFFFF,t_70,g_se,x_16

 小伙伴自己也运行一下

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LiP6YGN5LiJ5Y2B5YWt5bK4,size_19,color_FFFFFF,t_70,g_se,x_16

 

下期见

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
背景   约瑟夫问题(Josephus Problem)据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。 然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。   原题:  用户输入M,N值,N个人围成一个环,从0号人开始数,数到M,那个人就退出游戏,直到最后一个人 求最后一个剩下的人是几号? 问题描述   设编号为1-n的n(n>0)个人按顺时针方向围成一圈.首先第1个人从1开始顺时针报数.报m的人(m 为正整数).令其出列。然后再从他的下一个人开始,重新从1顺时针报数,报m的人,再令其出列。如此下去,直到圈中所有人出列为止。求出列编号序列。 基本要求   需要基于线性表的基本操作来实现约瑟夫问题   需要利用数组来实现线性表      输入输出格式   输入格式:n,m   输出格式1:在字符界面上输出这n个数的输出序列    输出格式2:将这n个数的输出序列写入到文件中 做内容 使用单链表来实现之 使用循环链表来实现之 测试用例   输入:10,3   输出:3 6 9 2 7 1 8 5 10 4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值