约瑟夫环

来源:互联网 发布:在线网络理财产品排名 编辑:程序博客网 时间:2024/05/01 02:15
#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);} 

0 0
原创粉丝点击