约瑟夫环问题:数组、循环链表、递归

在这里插入图片描述

一、数组

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int a[110]={0};
int main()
{
   int n,m;//n个人数到m的出局
   cin>>n>>m;
   int cnt=0,k=0,i=0;//cnt记录出局人数,k记录数的数1-m
   while(cnt!=n){
      i++;//人向后移动
      if(i>n) i=1;
      if(a[i]==0){//没有出局
          k++;//报数
          if(k==m){//报到m
              a[i]=1;
              cnt++;
              cout<<i<<" ";//若编号从0开始1,2,3,,,10,则i-1
              k=0;//清空k,重新开始报数
          }
      }
  }
}

二、循环链表

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;

//定义结点
typedef struct node{
    int data;
    struct node *next;
}Node;

void ysf(int n,int m){//n个人,数到数字为m出局
    //创建链表  尾插法
    Node *head=NULL,*pre=NULL,*p=NULL,*s=NULL;
    head=(Node *)malloc(sizeof(Node));//创建第一个节点,放数据
    head->next=NULL;
    pre=head;
    p=head;
    
   for(int i=1;i<n;i++){
       s=(Node *)malloc(sizeof(Node));
       s->data=i;
       s->next=NULL;
       p->next=s;
       p=s;//p=p->next
   }
   
   //循环队列
   p->next=head;
   p=head;
   
   //约瑟夫环逻辑代码
   while(p->next!=p){
       for(int i=1;i<m;i++){
           pre=p;
           p=p->next;
       }
       //数到m
       cout<<p->data<<" ";
       pre->next=p->next;//删除p结点
       p=p->next;
       
   }
    //输出最后一个结点
    cout<<p->data<<" ";
}
int main()
{
    ysf(10,3);
    return 0; 
}

三、递归

在这里插入图片描述
视频:麦克老师讲算法bz

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int ysf(int n,int m,int i){//设f(n,m,i)为n个人的环,报数为m,第i个人出环的编号
    if(i==1){
        return (n-1+m)%n;
    }else{
        return (ysf(n-1,m,i-1)+m)%n;
    }
}
int main(){
    int n,m;//n个人数到m的出局
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        printf("第%d次出环:%d\n",i,ysf(n,m,i));
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值