约瑟夫斯问题求解.pdf

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

-

实验一:约瑟夫斯问题求解

一、问题描述

1.实验题目:约瑟夫斯问题的一种描述是:编号为1,2,……n的n个人按顺时针方向围

坐一圈,每人持有一个密码9(正整数)。一开场任选一个正整数作为报数上限值m,从第一

个人开场按照顺时针方向自1开场报数,报到m时停顿报数,报m的人出列,将他的密码

作为新的m值,从他在顺时针方向下一个人开场重新重新从1报数,如此下去,直至所有

的人全部出列为止。试设计一个程序,按出列顺序印出各人编号。

2.根本要求:利用单向循环链表模拟此过程,按照出列的顺序印出各人编号。

3.测试数据:n=7,7个人的密码依次为3,1,7,2,4,8,4.m的初始值为6〔正确的

出列顺序应为6,1,4,7,2,3,5。

二、需求分析

1.程序所能到达的根本可能:本程序能够按出列顺序印出各人编号,程序运行后显示提示

信息,提示用户输入人数n,初始报数值m,n个人的密码,程序需自动考虑重复的,用户输

入完毕后,程序自动输出运算结果。

2.输入的形式及输入值围:输入人数n,初始报数值m,n个人的密码,所有值均为正整

数int型。

3.输出的形式:输出的是按出列顺序印出各人编号,为正整数int型。

4.测试数据要求:测试数据要求为int型

三、概要设计

1.所用到得数据构造及其ADT

为了实现上述功能,应以单向循环链表有序链表表示集合

数据类型。

.z.

-

1.单向循环链表抽象数据类型定义:

typedefstructnode

{

ElemTypedata;

ElemTypenum;

structnode*ne*t;

}SLNODE;

根本操作:

structnode*create_sl(intn);//创立单向循环链表

2.主程序流程及其模块调用关系

1〕创立循环链表的流程图

2)约瑟夫问题求解流程图

3)主函数流程图

四、详细设计

1.实现每个操作的伪码,重点语句加注释

主程序:

voidmain()

{

SLNODE*head;

intn,m;

head=(SLNODE*)malloc(sizeof(SLNODE));

printf(/*************************************/\n);//初始界面

.z.

-

printf(**:031350102\n);

printf(:王亚文\n);

printf(约瑟夫斯问题求解\n);

printf(/*************************************/\n);

printf(输入总人数n=\n);

scanf(%d,n);

printf(输入初始报数值m=\n);

scanf(%d,m);

head=create_sl(n);

Josephus(head,n,m);

}

2.创立循环单链表

structnode*create_sl(intn)

{

SLNODE*p,*s,*head;

ElemType*;

inta;

head=(SLNODE*)malloc(sizeof(SLNODE));

p=head;

head-ne*t=head;

for(a=1;a=n;a++)//循环直到输入n个密码值跳出循环

{

.

您可能关注的文档

文档评论(0)

151****1902 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档