首页 > 代码库 > 约瑟夫问题求解
约瑟夫问题求解
问题描述:有N个人,从1到N的编号,围成一个环,第一个人从1开始报数,每隔第M的人就出局,剩下的人继续报数,以此类推,求最后剩下那个人的编号。
上次去参加去哪儿网的笔试,就考到了这个问题,说的是12个人,一个圈,从第一个人开始报数,1-3,每次报到3的人出局,求最后剩下那个人原来的序号。
可以用一个循环链表来解决,将所有人的编号构成一个循环链表,每隔M就删掉一个节点,直到最后剩下一个。
void josephus (int N, int M) { //定义一个节点,当然定义在这里不怎么合适 struct node { int item; struct node *next; }Node; //创建第一个节点 Node *t = malloc (sizeof (Node)); Node *x = t; t -> item = 1; t -> next = t; //创建剩下的节点 for (int i = 2; i <= N; i++) { Node *new = malloc (sizeof (Node)); x -> next = new; x = x -> next; x -> item = i; x -> next = t; } //循环数数,每隔M的人出局 while (x != x -> next) //不是最后一个节点 { for (int i = 1; i < M; i++) x = x -> next; //第M个人出局 Node *del = x -> next; x -> next = x -> next -> next; free(del); N--; } //打印最后一个节点 printf ("%d", x -> item); free(x); }
约瑟夫问题求解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。