约瑟夫环C++代码及实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一约瑟夫环问题实验报告

通信二班雷鹤20100820207

李春阳20100820208

李孟琪20100820209

一、问题描述

设编号为1-n的n(n>0)个人按顺时针方向围成一圈.首先第1个人从1开始顺时针报数.报m的人(m 为正整数).令其出列。然后再从他的下一个人开始,重新从1顺时针报数,报m的人,再令其出列。如此下去,直到圈中所有人出列为止。求出列编号序列。

二、需求分析

1、需要基于线性表的基本操作来实现约瑟夫问题

2、需要利用数组来实现线性表

3、测试用例

输入:10,3

输出:3 6 9 2 7 1 8 5 10 4

三、概要设计

抽象数据类型

为实现上述程序的功能,应以整数存储用户的输入,以及计算出的结果。

算法的基本思想

利用数组来代表一个环,然后模拟报号出圈的过程,直到所有人都出圈。

程序的流程

程序由三个模块组成:

(1)输入模块:完成两个正整数的输入,存入变量n和m中。

(2)计算模块:计算这n个数的输出序列

(3)输出模块:屏幕上显示这n个数的输出序列。

四、详细设计

程序代码:

#include

using namespace std;

main()

{

int n,m,k,j; //n为总人数,m为出列编号

cin>>n>>m;

int *listArray=new int[n]; //将n个人放在大小为n的数组中

int *outArray=new int[n]; //用以存放依此出列的人的编号

for(int i=0;i

listArray[i]=i+1; //对n个人进行编号

for(i=1,j=k=0;k

{

if(listArray[j]!=0)

{

if(i==m) //报数编号和出列编号相同时

{

outArray[k]=listArray[j];//将该元素放置到出列数组里,并输出

cout<

k++;

listArray[j]=0; //将出列元素置0

i=1; //下一个元素从1开始重新报数

}

else

i++; //报数编号与出列编号不同时,继续报数

}

}

cout<<'\n';

return 0;

}

物理数据类型

队列元素及出列序列都以整型数组方式存储

算法的具体步骤

(1)将队列里的元素编号

(2)循环访问数组元素

(3)第一个元素从1开始报数,报数编号与出列编号相同时出列,并将该元素置为0

(4)下一个元素重新从1开始报数,依次循环

输入和输出的格式

输入格式:n,m

输出格式1:在字符界面上输出这n个数的输出序列

输出格式2:将这n个数的输出序列写入到文件中

五、测试结果

其他程序代码

程序1

#include

#include

typedef int type; //结点数据域类型为整型

typedef struct LNode //结点类型定义

{

struct LNode *next;//结点的指针域

type a; //结点的数据域

}link;

void initLink(link* &l)

{

l=(link*)malloc(sizeof(link));//在内存的动态存储区申请链表长度的连续空间

//初始化链表

l->next=l;

}

void insert(link* &l) //在其后插入新成员

{

link* p;

p=(link*)malloc(sizeof(link));

p->next=l->next;

l->next=p;

}

void destory(link* &l) //删除其后面的元素

{

link* t;

t=l->next;

l->next=l->next->next;

free(t);

}

int main()

{

int m,n;

char p;

while(scanf("%d%c%d",&n,&p,&m)!=EOF)

{

link* head;

link* temp;

initLink(head);

temp=head;

for(int i=0 ; i

{

insert(temp);

temp->next->a=i+1; //创建链表

temp=temp->next;

}

temp->next=NULL;

temp=head;

while(head->next!=NULL)

{

for(int i=1;i

{

if(temp->next==NULL)

temp=head;

}

temp=temp->next;

}

if(temp->next==NULL)

{

printf("%d ",head->next->a);

destory(head);

}

else

{

printf("%d ",temp->next->a);

destory(temp);

}

}

printf("\n");

}

}

程序2

#include

using namespace std;

void main()

{

int n,m,a[100001],k,i,j;

cin>>n;

if(n>100000)

相关文档
最新文档