约瑟夫环问题

题目描述

编号为1,2,…,n的n个人按顺时针方向围坐在一张圆桌周围,每人持有一个密码(正整数)。一

开始任选一个正整数m作为报数上限值,从第一个人开始按顺时针方向自1开始报数,报到m时停止报数,报m的那

个人出列,将他的密码作为新的m值,从他顺时针方向的下一个人开始重新从1报数,数到m的那个人又出列;如

此下去,直至圆桌周围的人全部出列为止。要求按出列顺序输出n个人的编号。

输入

第一行输入两个整数,依次表示人数n和初始化密码m,以空格间隔。

第二行依次输入n个整数,分别表示n个人的密码,以空格间隔。

输出

按出列次序输出每个人的编号,以空格间隔。

样例输入

7 20

3 1 7 2 4 8 4

样例输出

6 1 4 7 2 3 5


#include<stdio.h>
#include<stdlib.h>
typedef struct  LNode           //定义结构体
{
    int num,pwd;                  //num定义人的序号,psw定义密码;
    struct LNode *next;
 } LNode ;
struct LNode *p,*head,*pt;       //定义结点
//创建循环链表函数
int Createlinklist(int n)
{
    int i;
    head=(struct LNode*)malloc(sizeof(struct LNode));   //创建带头结点的链表
    p=head;
    for(i=1;i<n;i++)
    {
        pt=(struct LNode*)malloc(sizeof(struct LNode));
        p->next=pt;
        p=pt;
    }
    p->next=head;
    pt=head;
    return 0;
}
//创建输入密码函数
int Enterpwd(int n)
{
    int i,j;
    for(i=1;i<=n;i++)
    {
        scanf("%d",&j);
        pt->num=i;   //num存储人的序号
        pt->pwd=j;   //pwd存储人的密码
        pt=pt->next;
    }
    pt=p;
    return j;
 }
 //创建输出函数
 int Outlist(int m,int n)
 {
     int i,a;
     for(i=1;i<=n;i++)    //for循环搜索链表
     {
         for(a=1;a<m;a++)
         {
             pt=pt->next;
         }
         p=pt->next;
         m=p->pwd;
         printf("%d ",p->num);   //输出人的序号
         pt->next=p->next;
         free(p);
     }
     return 0;
  }
//主函数
void main()
{
    int m,n;            //m为报数上限值,n为人数
    scanf("%d%d",&n,&m);
    Createlinklist(n);
    Enterpwd(n);
    Outlist(m,n);
 }

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值