• 约瑟夫问题及其实现代码


    问题背景:

      据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

    实现方法:

      首先建立一个带有41个节点的循环链表,然后从头结点开始计数,计数到3,把该节点删除,并且把该结点的元素打印到屏幕,循环往复,直到遍历循环链表的全部结点。

    实现代码:

    #include<stdio.h>
    #include<stdlib.h>
    #define N 41 
    #define M 3
    typedef struct Node
    {
    	int data;
    	struct Node *next; 
    }Node;
    typedef struct Node *LinkList;
    
    //构造n=循环链表
    Node* CreatList(struct Node *La,int n)
    {
    	//构造一个循环链表,返回循环链表的首地址 
    	int i;
    	struct Node *p,*s;
    	La = (LinkList)malloc(sizeof(Node));
    	La->next = NULL;
    	p = La;
    	for(i = 1;i <= N;i++)
    	{
    	s = (LinkList)malloc(sizeof(Node));
    	s->data = i;
    	s->next = p->next;
    	p->next = s;
    	p = p->next;
    	}
    	p->next = La->next;
    	return p ;
    } 
    //打印函数
    void printx(struct Node *La,int n, int m)
    {
    	int i,j;
    	struct Node *p,*s;
    	p = La;
    		
    	for(i = 1;i <= n;i++ )
    	{
    		p = p->next;
    		p = p->next;
    		s  = p->next;
    		p->next = s->next;  
    		printf("%5d",s->data);
    		free(s);		
    	}
    } 
    
    int main(int argc,char *argv[]) 
    {
    	int i;
    	struct Node *L;
    	struct Node *q;
    	L = CreatList(L,N);
    	q = L;
    	printf("Josephus 的输出顺序为:
    ");
    	printx(L,N,M);
    	printf("
    ");
    	system("pause");
    	return 0;
    }
    

      

  • 相关阅读:
    那些好的句子
    ❤️博客使用说明-飞沙
    求n以内,除5的倍数的和
    C# 枚举
    2021年bilibili程序员节日
    MT管理器使用技巧
    腾讯找人工客服
    校报白皮书
    C语言教程(下)
    svn版本控制
  • 原文地址:https://www.cnblogs.com/devinblog/p/4160593.html
Copyright © 2020-2023  润新知