约瑟夫环C++代码及实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)