
数据结构设计约瑟夫环问题
1个回答
展开全部
问题描述:joseph环问题的一种描述是:编号为1,2,3,···,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止。试设计一个程序求出出列顺序。
基本要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序印出个人的编号
测试数据:m的初始值为20;n=7,7个人的密码依次为3,1,7,2,4,8,4,首先m值为6
# include <stdio.h>
# define SIZE 20
int joseph(int a[],int m,int n)
{
int b[SIZE];
int i;
int flag=0;
int code;
int sum=n;
int point=0;
int num=m;
for(i=0;i<n;i++)
{ b[i]=i+1; }
while(sum!=0)
{
for(i=1;i<=num;i++)
{ if(point>=sum) point=1;
else point++;
}
num=a[point-1];
code=b[point-1];
for(i=point;i<=sum;i++)
{ a[i-1]=a[i];
b[i-1]=b[i];
}
sum--;
flag++;
point--;
printf("已退出%d人,退出的人的编号为%d.\n",flag,code);
}
return 0;
}
main()
{
int m,n,i;
int array[SIZE];
printf("约瑟夫环求解,当前设置最大人数为%d.\n",SIZE);
printf("报数上限:\n");
scanf("%d",&m);
printf("总人数为:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("第%d人的密码为:",i+1);
scanf("%d",&array[i]);
}
joseph(array, m, n) ;
return 0;
}
这是我之前做的大作业,望采纳。
基本要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序印出个人的编号
测试数据:m的初始值为20;n=7,7个人的密码依次为3,1,7,2,4,8,4,首先m值为6
# include <stdio.h>
# define SIZE 20
int joseph(int a[],int m,int n)
{
int b[SIZE];
int i;
int flag=0;
int code;
int sum=n;
int point=0;
int num=m;
for(i=0;i<n;i++)
{ b[i]=i+1; }
while(sum!=0)
{
for(i=1;i<=num;i++)
{ if(point>=sum) point=1;
else point++;
}
num=a[point-1];
code=b[point-1];
for(i=point;i<=sum;i++)
{ a[i-1]=a[i];
b[i-1]=b[i];
}
sum--;
flag++;
point--;
printf("已退出%d人,退出的人的编号为%d.\n",flag,code);
}
return 0;
}
main()
{
int m,n,i;
int array[SIZE];
printf("约瑟夫环求解,当前设置最大人数为%d.\n",SIZE);
printf("报数上限:\n");
scanf("%d",&m);
printf("总人数为:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("第%d人的密码为:",i+1);
scanf("%d",&array[i]);
}
joseph(array, m, n) ;
return 0;
}
这是我之前做的大作业,望采纳。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?

2024-06-11 广告
杭州景联文科技有限公司专注于大模型数据集的研发与应用。我们深知,在人工智能飞速发展的时代,数据是驱动模型优化的核心动力。因此,我们致力于构建丰富、多元的大模型数据集,涵盖各行各业,为AI模型提供充足的“养分”。通过不断积累与优化,我们的数据...
点击进入详情页
本回答由景联文科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询