#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int rank;
struct node* next;
}*Node;
//遍历
void print(Node head){
Node temp=head->next;
while(temp){
printf("%d ",temp->rank);
temp=temp->next;
}
}
//建环 n个人
void build(Node head,int n){
Node temp=head;
for(int i=1;i<n+1;i++){
//插入n个人到后面
Node p=(Node)malloc(sizeof(struct node));
p->rank=i;
p->next=temp->next;
temp->next=p;
temp=p;
}
}
//计数
int getNum(Node head){
Node temp=head->next;
int num=0;
while(temp){
num++;
temp=temp->next;
}
//printf("个数%d ",num);
return num;
}
//约瑟夫环问题
void joseph(Node head,int m){
Node temp=head;
int num=0;
while(temp){
if((num+1)==m){
Node p=temp->next;
temp->next=temp->next->next;
free(p);
num=0;
}else{
temp=temp->next;
num++;
}
// printf("\n");
// print(head);
if(temp->next==NULL&&getNum(head)!=1){
temp=head;
}else if(getNum(head)==1){
break;
}
}
}
//递归求解
int joseph2(int n,int m){
int s=0;
for(int i=2;i<n+1;i++){
s=(s+m)%i;
}
return s+1;
}
int main(){
Node head=(Node)malloc(sizeof(struct node));
head->next=NULL;
build(head,20);
printf("筛选前:");
print(head);
printf("\n%d ",joseph2(getNum(head),7));
joseph(head,7);
printf("\n筛选后:");
print(head);
}
约瑟夫环
最新推荐文章于 2024-04-16 12:11:58 发布