约瑟夫问题的源程序?

如题所述

#include <cstdio>

struct Node
{
int data;
Node * next;
};

Node* make_list(int n)//建立一个循环链表
{
Node *p = new Node, *q;
int i;

p->data = 1;//先建立一个只有一个节点的循环链表
p->next = p;

for(i = 2; i <= n; i++)//再向其中插入剩下的n-1个节点
{
q = new Node;
q -> data = i;
q -> next = p -> next;
p -> next = q;
p = q;
}
return p;
}

void Joseph(int n, int m)
{
Node *p = make_list(n), *q = p;//p指向最后一个节点,保证下一个是第一个节点
int i, j;
for(i = 0; i < n; i++)
{
p = q;
p = p -> next;
for(j = 1; j < m; j++)
{
p = p -> next;
q = q -> next;
}
printf("%d ", p -> data);
q -> next = p -> next;
delete p;
}
printf("\n");
}

int main()
{
int n, m;
while(scanf("%d%d", &n, &m) == 2 && m > 0 && n > 0)//输入两个数,n表示一共n个人,m表示每次从1数到m
Joseph(n, m);
return 0;
}
温馨提示:内容为网友见解,仅供参考
无其他回答

C语言-有趣的约瑟夫问题及解决办法
程序源代码如下,通过调整Start、Count、length这三个参数,可以改变游戏规则,尝试不同的初始位置和人数。运行程序后,输出结果验证了约瑟夫和他的朋友策略的正确性。约瑟夫问题的解决方案不仅展示了数学与计算机科学的结合,还富有策略与智慧。通过调整参数探索不同的解决方案,可以加深对问题本质的理解。

数据结构中的约瑟夫环问题用C语言怎么编写出来啊?
2.个人分析: 算法比较经典,对于这样的问题本应该使用链表的形式会比较容易.约瑟夫环算法 则体现了使用数组来完成链表该完成的功能,虽然形式上完全不相同,但却求出了 相同的结果.有异曲同工之妙.总之我个人认为是数组中非常经典的算法了.希望本 人写的代码不会叫大家啐骂!3.程序源代码:include <st...

约瑟夫斯问题
这个谜题源于1世纪的历史记载,约瑟夫斯和他的战友面临绝境时,通过抽签决定生死。有多种方法解决这个问题。一种是通过编程模拟,利用循环链表来重现过程,时间复杂度为O(n*m)。另一种是数学推导,当跳跃数k=2时,可以通过递推公式找到特定情况下幸存者的初始位置。如果k不为2,递推公式可以进一步扩展。

【基础】约瑟夫问题
\/\/约瑟夫问题 include "stdio.h"include "stdlib.h"include "vector"using namespace std;void main(){ vector<int> a;\/*当前人是否被排除,0为未排除,1为被排除*\/ int s=0\/*总人数*\/,i=0\/*循环控制变量*\/,j=0\/*本轮的序数*\/,k=0\/*已排除的人数*\/,n=0\/*排除间隔*\/;printf("...

约瑟夫问题的问题来历
*问题分析与算法设计约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。这里给出一种实现方法。题目中30个人围成一圈,因而启发我们用一个循环的链来表示,可以使用结构数组来构成一个循环链。结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为...

约瑟夫环公式是怎样推导出来的?
1、约瑟夫环公式推导:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列。依此规律重复下去,直到圆桌周围的人全部出列。这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三...

约瑟夫问题来历
历史上,有一个关于犹太历史学家约瑟夫的传说。在罗马人占领乔塔帕特后,他和39位同伴躲进了一个洞穴。他们决定通过自杀来避免落入敌人手中,制定了一个奇特的规则:39人围成一个圆圈,从第1个人开始报数,每报到第3人就执行自杀,然后由下一个人继续。Josephus和他的一位朋友决定利用这个规则,将自己...

约瑟夫问题
约瑟夫问题:include<iostream.h> struct Node { int data;Node *pNext;};void main(){ int n,k,m,i;Node *p,*q,*head;cout<<"输入n的值:";cin>>n;cout<<"输入起始报数人号码k的值:";cin>>k;cout<<"输入 数到m出列的m的值:";cin>>m;head=(Node*)new Node; \/\/确定头结...

约瑟夫环的问题求解
约瑟夫环问题是一个数学问题,源自于古罗马历史学家约瑟夫斯的故事。在公元前67年,约瑟夫斯和他的同伴们在被罗马人占领的约塔帕塔镇面临自杀的威胁。他们提议所有人都围成一个圈,并按照特定规则进行轮次消减,直到仅剩下一人。约瑟夫斯和他的朋友通过选择特定的位置保住了性命,最终成为了著名的罗马历史...

约瑟夫问题
int data;LNode* next;};void CreateList(LNode**L,int n){ LNode *p,*q;L=new LNode;(*L)->data=1;(*L)->next=*L;q=*L;for(int i=2;i<=n;i++){ p=new LNode;p->data=i;q->next=p;q=p;} q->next=*L;} void josephus(LNode *L,int m){ LNode *p,*q;p...

相似回答
大家正在搜