首页 > 代码库 > 约瑟夫环问题
约瑟夫环问题
#include<stdio.h>
#include<stdlib.h>
/**
约瑟夫环
编号为1,2,3……,n的n个人按顺时针方向围坐一圈,每个人手中持有一个密码。
开始任选一个报数上限正整数m,从第一个人开始按顺时针方向自1开始报数,
报道m停止。报m的人出列,将手中的密码作为新m,从他下一个人从1开始重新数
数,循环,求最后剩下那个人的最初编号
**/
typedef struct Node{
int pwd;
struct Node *next;
}Node;
void exploer(Node * head, int num){
if( head == NULL || head->next==NULL){ return ;}
while(1){
while(num >0){
if(head->next==head){ printf("exit\n");return ;}
num--;
if(num==0){
num = head->next->pwd;
printf("pwd is :%d\n",num);
head->next=head->next->next;
}
}
}
}
int main(){
int i=0,a=1,b=10;
int pwd = (rand() % (b-a+1))+ a;
Node *node = (Node *)malloc(sizeof(Node)*1);
Node *head = node;
Node *tmp = NULL;
node->pwd = pwd;
printf(" start pwd is :%d\n",pwd);
node->next= NULL;
while( (i++) < 20){
pwd = (rand() % (b-a+1))+ a;
tmp = (Node*)malloc(sizeof(Node));
tmp->pwd=pwd;
tmp->next=NULL;
node->next=tmp;
node=tmp;
printf(" create pwd is :%d\n",pwd);
}
node->next=head;
exploer(head,1);
}
约瑟夫环问题