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

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

二、需求分析 1、需要基于线性表的基本操作来实现约瑟夫问题 2、需要利用数组来实现线性表 3、测试用例 输入:10,3 输出:3 6 9 2 7 1 8 5 10 4
三、概要设计
抽象数据类型 为实现上述程序的功能,应以整数存储用户的输入,以及计算出的结果。 算法的基本思想 利用数组来代表一个环,然后模拟报号出圈的过程,直到所有人都出圈。 程序的流程 程序由三个模块组成: (1) 输入模块:完成两个正整数的输入,存入变量 n 和 m 中。 (2) 计算模块:计算这 n 个数的输出序列 (3) 输出模块:屏幕上显示这 n 个数的输出序列。
其他程序代码 程序 1 #include<stdio.h> #include <stdlib.h> typedef int type; //结点数据域类型为整型 typedef struct LNode //结点类型定义 {
struct LNode *next;//结点的指针域
type a;
//结点的数据域
通信二班
实验一约瑟夫环问题实验报告
雷鹤 李春阳 李孟琪
20100820207 20100820208 20100820209
一、问题描述
设编号为1-n的n(n>0)个人按顺时针方向围成一圈.首先第1个人从1开始顺 时针报数.报m的人(m 为正整数).令其出列。然后再从他的下一个人开始,重 新从1顺时针报数,报m的人,再令其出列。如此下去,直到圈中所有人出列为止。 求出列编号序列。
}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; }
for(int i=0;i<n;i++)
listArray[i]=i+1; //对 n 个人进行编号
for(i=1,j=k=0;k<n;j=++j%n) //i 为报数编号,初始值为 1,循环访问
数组元素,即数组元素循环报数
{
if(listArray[j]!=0)
{
if(i==m)
Fra Baidu bibliotek
//报数编号和出列编号相同时
四、详细设计
程序代码:
#include <iostream>
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]; //用以存放依此出列的人的编号
{
outArray[k]=listArray[j];// 将 该 元 素 放 置 到 出 列 数 组
里,并输出
cout<<outArray[k]<<" ";
k++;
listArray[j]=0; //将出列元素置 0
i=1; //下一个元素从 1 开始重新报数
}
else
i++; //报数编号与出列编号不同时,继续报数
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)
printf("\n"); } }
程序 2 #include<iostream> using namespace std;
void main() {
int n,m,a[100001],k,i,j; cin>>n;
if(n>100000)
{ cout<<"请重输";
return; }
cin>>m; for(i=1;i<=n;i++) { a[i]=1; } j=0; k=0; for(i=1;i<=n;i++) {
{
link* head;
link* temp;
initLink(head);
temp=head;
for(int i=0 ; i<n ; i++)
{
insert(temp);
temp->next->a=i+1;
//创建链表
temp=temp->next;
} temp->next=NULL;
temp=head; while(head->next!=NULL) {
}
}
cout<<'\n';
return 0;
}
物理数据类型 队列元素及出列序列都以整型数组方式存储 算法的具体步骤
(1) 将队列里的元素编号 (2) 循环访问数组元素 (3) 第一个元素从 1 开始报数,报数编号与出列编号相同时出列,并
将该元素置为 0 (4) 下一个元素重新从 1 开始报数,依次循环 输入和输出的格式 输入格式:n,m 输出格式 1:在字符界面上输出这 n 个数的输出序列 输出格式 2:将这 n 个数的输出序列写入到文件中 五、测试结果
for(int i=1;i<m;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); } }
if(a[i]==1) {
j=j+a[i]; if(j==m) {
j=0; a[i]=0; k++; cout<<i<<" "; }
} if(i==n)
i=0; }
}
七、实验心得 李孟琪:该实验利用数组实现线性表,算法简便,但产生很多不必要的消耗,下 一步可以尝试采用单链表,双链表实现该问题。 李春阳:通过利用链表编写约瑟夫环,进一步掌握了约瑟夫环的原理,加深了对 链表使用的理解 雷鹤:这次实验遇到的最大问题是拘泥于基本要求中的利用数组来实现线性表, 并用线性表来实现约瑟夫环问题,在尝试用链表实现后问题变得简单了些;在插 入元素这一步费不少时间,头尾节点的移动关系也需要理解
相关文档
最新文档