- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
约瑟夫斯问题
实验一:约瑟夫斯问题实验报告
问题描述
1) 问题描述
约瑟夫斯(Josephus)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止。试设计一个程序,按出列顺序印出各人编号。
2)基本要求
利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
3)测试数据
m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4。m初值为6(正确的出列顺序应为6,1,4,7,2,3,5)。
需求分析
1.该程序所能实现的功能:将n个数字按照某一特定序列输出,直至全部输出为止。
2.输入的形式及输入值范围 :依次输入人数n、每个人的密码及报数上限m值。
3.输出的形式:按照报数上限m及每个人的密码依次输出每个人的编号。
4.测试数据要求:m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4。m初值为6(正确的出列顺序应为6,1,4,7,2,3,5)。
概要设计
主程序流程
获取每个人的密码,选定m的初值,调用函数,按照特定要求完成输出操作。
2.核心模块的算法伪码
主程序:
void main(void)
{
int m;
people *s;
s=GetData();
cout请输入m的初值:endl;
cinm;
DealData(s,m);
}
预编译代码:#includeiostream.h
详细设计
1.实现每个操作的伪码,重点语句加注释
(1)建立“人”的结构体
struct people
{
int data;
int num;
people *next;
};
(2)获取每个人的相关数据
people *GetData()
{
int n;
people *p1,*p2,*head;
head=NULL;
cout请输入人数:;
cinn;
cout请依次输入每个人的密码:endl;
for(int i=0;in;i++)
{
p1=new (people);
cinp1-data;
p1-num=i+1;
if(head==NULL)
{
head=p2=p1; //建立首结点
}
else
{
p2-next=p1; //中间结点
p2=p1;
}
}
if(head!=NULL)
p2-next=head;
return(head); //循环链表
}
2.函数调用关系图
Main()
void DealData(people *s,int m)
people *GetData()
五、调试分析
1. 设计与调试过程中遇到的问题分析、体会.
在调试过程中遇到了死循环的情况,自己反复看了很久也未能查找到错误,直到请同学帮忙看,才终于发现原来是一个在循环条件中,写丢了一个条件。后来回想,觉得当初自己检查的时候不够仔细,大概也有些主观思想——认为不可能出错——掺杂其中,导致有此结果。以后写程序要更认真才行。
2. 主要算法的时间
主程序:循环算法。
六、使用说明
打开此程序,点击运行,按照屏幕输出显示依次输入所需数据即可——
首先输入参与的人数;然后依次输入每个人手中的密码;最后输入m的初值,即可得到输出结果。
七、测试结果
八、附录
源程序
#includeiostream.h
struct people
{
int data;
int num;
people *next;
};
people *GetData()
{
int n;
people *p1,*p2,*head;
head=NULL;
cout请输入人数:;
cinn;
cout请依次输入每个人的密码:endl;
for(int i=0;in;i++)
{
p1=new (people);
cinp1-data;
p1-num=i+1;
if(head==NULL)
{
head=p2=p1; //建立首结点
}
else
{
p2-next=p1; //中间结点
p2=p1;
}
}
if(head!=NULL)
p2-next=head;
return(head); //循环链表
}
void DealData(people *s,int m)
{
people *p1,*p2,*q;
p
您可能关注的文档
- 131——135课知识点.ppt
- 16氨水.doc
- 17教学论文.doc
- 06信道.ppt
- 2009-2010学年计算机教学计划.doc
- 2010年化学综合模拟题二.doc
- 2012年七年级数学下学期期末综合复习检测卷人教新课标版.doc
- 2012年一年级数学期中测试题.doc
- 2011年银行从业考试《公共基础》知识点归纳2.doc
- 2011年公积金提取说明.doc
- 2025年浙江体育职业技术学院单招职业倾向性考试题库附答案.docx
- 2025年合肥科技职业学院单招职业技能考试题库必威体育精装版.docx
- 2025年梧州职业学院单招职业技能测试题库必威体育精装版.docx
- 2025年山西职业技术学院单招职业倾向性考试题库附答案.docx
- 2025年安庆医药高等专科学校单招职业适应性测试题库及参考答案1套.docx
- 2025年喀什职业技术学院单招职业适应性考试题库精选.docx
- 2025年山东轻工职业学院单招职业适应性考试题库必威体育精装版.docx
- 2025年桂林师范高等专科学校单招职业倾向性测试题库精选.docx
- 胃脘痛中医护理查房.pptx
- 2025年三门峡职业技术学院单招职业倾向性测试题库精编.docx
文档评论(0)