您的位置:首页 > 其它

约瑟夫问题

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;
}


结果显示:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  实例