约瑟夫问题
2016-11-15 22:30
295 查看
约瑟夫环(约瑟夫问题)
是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列,求最后一个人出列的编号
实例代码:
/*****************************************************
copyright (C), 2016-2017, Lighting Studio. Co., Ltd.
Author ChenYangYang Version:0.1 Date:2016/11/15
Description:约瑟夫环问题
*****************************************************/
#include <stdio.h>
#include <stdlib.h>
struct person
{
int num;
struct person* next;
};
typedef struct person Person;
typedef Person* Link;
void initLink(Link *head);
int num;
Link newPerson;
void tailInsert(Link *head,Link *newNode)
{
if(NULL == *head)
{
(*newNode)->next = *head;
*head = *newNode;
}
else
{
Link temp = *head;
while(temp->next != NULL)
{
temp = temp->next;
}
temp->next = *newNode;
(*newNode)->next = NULL;
}
}
void delNode(int flag,Link *head)
{
Link temp1 = *head;
Link temp2 = (*head)->next;
while(temp2->num != flag)
{
temp1 = temp1->next;
temp2 = temp2->next;
}
temp1->next = temp2->next;
}
void procress(Link *head)
{
int i = 1;
Link temp = *head;
while(num > 1)
{
if((i%3) == 0)
{
delNode(temp->num,head);
num--;
}
temp = temp->next;
i++;
}
printf("result = %d\n",temp->num);
}
void createLink(Link *head)
{
*head = NULL;
}
void initLink(Link *head)
{
int i;
for(i = 0; i < num; i++)
{
newPerson = (Link)malloc(sizeof(Person));
if(NULL == newPerson)
{
printf("malloc error!\n");
exit(1);
}
else
{
newPerson->num = i+1;
tailInsert(head,&newPerson);
}
}
newPerson->next = *head;
}
int main()
{
Link head;
createLink(&head);
printf("Please input person number is:");
scanf("%d",&num);
initLink(&head);
procress(&head);
return 0;
}
结果显示:
是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列,求最后一个人出列的编号
实例代码:
/*****************************************************
copyright (C), 2016-2017, Lighting Studio. Co., Ltd.
Author ChenYangYang Version:0.1 Date:2016/11/15
Description:约瑟夫环问题
*****************************************************/
#include <stdio.h>
#include <stdlib.h>
struct person
{
int num;
struct person* next;
};
typedef struct person Person;
typedef Person* Link;
void initLink(Link *head);
int num;
Link newPerson;
void tailInsert(Link *head,Link *newNode)
{
if(NULL == *head)
{
(*newNode)->next = *head;
*head = *newNode;
}
else
{
Link temp = *head;
while(temp->next != NULL)
{
temp = temp->next;
}
temp->next = *newNode;
(*newNode)->next = NULL;
}
}
void delNode(int flag,Link *head)
{
Link temp1 = *head;
Link temp2 = (*head)->next;
while(temp2->num != flag)
{
temp1 = temp1->next;
temp2 = temp2->next;
}
temp1->next = temp2->next;
}
void procress(Link *head)
{
int i = 1;
Link temp = *head;
while(num > 1)
{
if((i%3) == 0)
{
delNode(temp->num,head);
num--;
}
temp = temp->next;
i++;
}
printf("result = %d\n",temp->num);
}
void createLink(Link *head)
{
*head = NULL;
}
void initLink(Link *head)
{
int i;
for(i = 0; i < num; i++)
{
newPerson = (Link)malloc(sizeof(Person));
if(NULL == newPerson)
{
printf("malloc error!\n");
exit(1);
}
else
{
newPerson->num = i+1;
tailInsert(head,&newPerson);
}
}
newPerson->next = *head;
}
int main()
{
Link head;
createLink(&head);
printf("Please input person number is:");
scanf("%d",&num);
initLink(&head);
procress(&head);
return 0;
}
结果显示: