编程实现约瑟夫环问题

来源:互联网 发布:同城配送软件 编辑:程序博客网 时间:2024/05/29 14:06

据说著名犹太历史学家Josephus有过以下故事:在罗马人占领桥塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被人抓住,于是决定

了一个自杀方式,41个人排成一个圆圈,由第一个人开始报数,每报数到3的人就必须自杀,然后再由下一个人重新报数,直到所有人都自杀身亡为止。然而Josephus及他的朋友

并不想遵从,Josephus要他的朋友假装遵从,他将朋友与自己分别安排在第16个与31个位置,于是逃过了这场死亡游戏;


代码实现:

#include <stdio.h>#include <stdlib.h>#define N 41#define M 3struct node{    int data;    struct node *link;};int ExitRing(int n, int m){    struct node *head,*p,*q;    int result,i,j;    head = (struct node *)malloc(sizeof(struct node));    head->data = 1;    head->link = head;    p = head;    q = NULL;    for(i = 2;i <= n;i++){        q = (struct node *)malloc(sizeof(struct node));        q->data = i;        q->link = head;        p->link = q;        p = q;    }    for(i = 1;i <= n-1; i++){        for(j = 1;j <= m;j++){            p = q;            q = q->link;        }        p->link = q->link;        printf("%d ",q->data);        free(q);        q = p;    }    result = p->data;    free(p);    return result;}int main(){    int last;    printf("出口顺序是:\n");    last = ExitRing(N,M);    printf("%d",last);    printf("\n最后一个是:%d \n",last);    printf("\n");    return 0;}
五个猴子(编号1~15)站成一群选大王,依次从1到3报数,数到3退出,往复从1到3报数,最后剩下一个猴子为王,求该猴子的编号;

代码实现:

#include <stdio.h>int main(){    int n, m, i, s = 0;    printf ("输入猴子个数\n");    scanf("%d", &n);    printf("输入猴子报数(>1)\n");    scanf("%d",&m);    for (i = 2; i <= n; i++)    {        s = (s + m) % i;    }    printf ("\nThe winner is %d\n", s+1);}


原创粉丝点击