约瑟夫问题_百度百科 http://baike.baidu.com/link?url=EuXtXV4hPi1AtRdzY0vMPG1gQg1kt3uCS5g4Bfy_RzWXAnDwwjJkhxWdRfk2LPnkqubRBTb52CXEaUa5jbIRaK
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define RECURSION
//Monkey Node definition
typedef struct node{
int number;
struct node *next;
}node;
//Josephus Problem
#ifdef RECURSION
void king(struct node *list,int m)
{
int i;
struct node *pout=list;
if(pout->next != pout)
{
//one more monkeys
for(i=1; i<m; i++)
pout=pout->next;
for(list=pout; list->next != pout;)
list=list->next;
printf("%5d",pout->number); //show the monkey to be out
list->next = pout->next; //get out of list
free(pout); //free the node
king(list->next,m); //RECURSION
}
else
//the last one monkey
printf("\nThe king is the monkey %d\n",list->number);
}
#else
void king(struct node *list,int m)
{
int i;
struct node *pout=NULL;
for(pout=list;pout->next!= pout;pout=list->next)
{
for(i=1; i<m; i++)
pout=pout->next;
for(list=pout; list->next != pout;)
list=list->next;
printf("%5d",pout->number); //show the monkey to be out
list->next = pout->next; //get out of list
free(pout); //free the node
}
//the last one monkey
printf("\nThe king is the monkey %d\n",list->number);
}
#endif
//generate the cycle list of n monkeys (n>=1)
struct node* CreateCycle(int n)
{
int i;
struct node *head,*tail,*newnode;
tail = head = (struct node*)malloc(sizeof(struct node));
head->number = 1;
head->next = head;
for(i=2;i<=n;i++)
{
newnode = (struct node*)malloc(sizeof(struct node));
newnode->number = i;
newnode->next = head;
tail->next = newnode;
tail=newnode;
}
return head;
}
int main(void)
{
int total,out;
struct node *list=NULL;
// n monkeys in total
do
{
printf("How many monkeys in total:");
scanf("%d",&total);
}while(total<1);
//which monkey gets out each time
do
{
printf("Which monkey to be out:");
scanf("%d",&out);
}while(out<1);
list = CreateCycle(total);
printf("monkeys out in order:\n");
king(list,out);
return 0;
}