约瑟夫问题
已知n个人围城一周,编号1,2,3,.......,n,从1号
开始报数,每隔k个人报到数的人出列。
常见解决方法,递归或循环链表模拟
循环链表模拟代码
#include<stdio.h> //以30个人为例 ,每7个人出列为例 #include<malloc.h> #define elemtype int #define status int #define ok 1 #define fail 0 typedef struct list{ //定义链表结构 elemtype data; list *next; }linklist , *linklistpoint ; int initlinklist(linklistpoint l) //初始化循环链表 { int i = 1; linklistpoint m,n; m = l; n = l; for(i = 1;i<=30;i++) //总共30个节点 { m->data = i; if(i != 30){ n = (linklist*)malloc(sizeof(linklist)); m->next = n; m = n; } else m->data = i; //将每个节点相应编号 m->next = l; } return m->data ; //返回总个数 } status joseph(linklistpoint l,int i) //模拟函数 { int answer; //存放最终结果 linklistpoint m; linklistpoint x; int n; m = l; x = l; n = 1; //当只剩最后一个节点时,模拟结束 while(m->next != m ){ for(n = 1;n < i-1;n++) //每7人出列一个 { m = m->next; } printf("%d->",m->next->data); //打印删去的节点 x = m->next; m->next = x->next; m = m->next; } answer = m->data; return answer; } int main(){ linklist l; linklistpoint p; int answer; int i; p = &l; answer = initlinklist(p); i = 7; printf("%d\n",answer); answer = joseph(p,i); printf("%d",answer); return 0; }
模拟实例 编译器DEVC++