约瑟夫问题:著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数到3,循环直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,于是,他将朋友与自己安排在第16个与第31个位置,于是最后自杀只剩下他们两人,便逃过了这场死亡游戏。
用链表实现:
#include<stdio.h> #include<stdlib.h> typedef struct node { int data; struct node *next; }node; node *create(int n) { node *p=NULL,*head; head =(node *)malloc(sizeof(node )); p=head; node *s; int i=1; if(0 != n) { while(i<=n) { s=(node *)malloc(sizeof(node)); s->data =i++; p->next=s; p=s; } s->next =head->next; } free(head); return s->next; } int main() { int n =41; int m=3; int i; node *p=create(n); node *temp; m %=n; while(p!=p->next) { for(i=1;i<m-1;i++) { p=p->next; } printf("%d->",p->next->data); temp=p->next; p->next=temp->next; free(temp); p=p->next; } printf("%d\n",p->data); return 0; }