一、数组
#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;
}