约瑟夫环问题.doc

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

计算机科学与工程学院

《算法与数据结构》试验报告[一]

专业班级

10级计算机工程01

试验地点

计算机大楼计工专业机房403

学生学号

001

指导教师

蔡琼

学生姓名

晏佳益

试验时间

2012-4-2

试验工程

算法与数据结构

试验类别

根底性〔〕设计性〔〕综合性〔√〕其它〔〕

试验目的及要求

掌握用VC++上机调试线性表的根本方法;

〔2〕掌握顺序表的存储结构以及根本运算的实现。

成绩评定表

类别

评分标准

分值

得分

合计

上机表现

积极出勤、遵守纪律

主动完成设计任务

30分

程序与报告

程序代码标准、功能正确

报告详实完整、表达收获

70分

备注:

评阅教师:

日期:年月日

试验内容

一、实验目的和要求

1、实验目的:

〔1〕掌握用VC++上机调试线性表的根本方法;

〔2〕掌握顺序表的存储结构以及根本运算的实现。

2、实验内容

约瑟夫环问题:设编号为1,2,3,……,n的n(n0)个人按顺时针方向围坐一圈,m为任意一个正整数。从第一个人开始顺时针方向自1起顺序报数,报到m时停止并且报m的人出列,再从他的下一个人开始重新从1报数,报到m时停止并且报m的人出列。如此下去,直到所有人全部出列为止。要求设计一个程序模拟此过程,对任意给定的m和n,求出出列编号序列。

3、实验要求:用顺序表实现。

设计分析

该问题涉及到循环问题,一般会联想到用链表来解决此问题。如果要用顺序表解决该问题,就要解决循环的问题,即在一般情况下,当访问到最后一个元素时,能返回到第一个,且数到最后一个为i时,在第一个为〔i+1〕,除非最后一个为输出。而且此机制是在数组下进行的〔顺序表的相关操作实质上是在数组中进行的〕。

尽管教材中有此问题的相关算法,且算法比拟简单,但我还是设计了另外一个算法。主要是应用了标记及数组元素下角标与新的下角标之间的关系而运行的。这为核心代码。

除了核心代码外,再加上顺序表的定义和初始化,以及销毁等,就构成了此问题的最终程序。

同时,要注意的是输入报错机制。

源程序代码

#includeiostream

#includestdlib.h

usingnamespacestd;

#defineMAX100

typedefstruct

{

intdata[MAX];

intlength;

}SqList;

voidCreatList(SqList*L,inta1[],intn1) //建立顺序表;

{

inti;

L=(SqList*)malloc(sizeof(SqList));

for(i=0;in1;i++)

L-data[i]=a1[i];

L-length=n1;

}

voidDestroyList(SqList*L) //销毁顺序表;

{

free(L);

}

voidmain()

{

intj=0,flag=0,t=1,n,m,N,a[MAX];

SqList*l1;

cout总共人数是:;

while(!((cinN)N0))

{

cout输入错误!!!endl;

return;

}

cout数到?的人出来:;

while(!((cinm)m0))

{

cout输入错误!!!endl;

return;

}

n=N;

cout请依次输入N个编号:endl;

for(inti=0;iN;i++)

cina[i];

CreatList(l1,a,N);

for(i=1;flagN;i++,t++,j++)

{

if(t==mj==n-1)

{

coutl1-data[j]\t;

for(intk=j;kn-1;k++)

l1-data[k]=l1-data[k+1];

t=0;

j=-1;

n=n-1;

flag++;

}

else

{

if(j==n-1)j=-1;

if(t==m)

{

coutl1-data[j]\t;

for(intk=j;kn-1;k++)

l1-data[k]=l1-data[k+1];

t=0;

j=j-1;

n=n-1;

flag++;

}

}

}

DestroyList(l1);

}

四、测试用例〔尽量覆盖所有分支〕

①输入正确的用例:7个数,

文档评论(0)

181****7662 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档