永发信息网

约瑟夫环问题

答案:2  悬赏:30  手机版
解决时间 2021-05-04 08:40
  • 提问者网友:火车头
  • 2021-05-03 15:06

编号为1,2,3,4…,n的n个人按顺时针方向围坐一圈,每人
持有一个密码(正整数).一开始任选一个正整数作为报数的上
限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m
时停止.报m的人出列,将他的密码作为新的m值,从他在顺时针
方向上的下一人开始重新从1报数,如此下去,直到所有人全部
出列为止.编程打印出列顺序.

#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int number;
struct LNode *next;
}LNode,*LinkList;
//建立线性表
int InitLinkList(LinkList &L){
L=new LNode;
if(L==NULL) return 0;
L->next=NULL;
return 1;
}
//对线性表进行初始化
int InputLinkList(LinkList &L,int m){
int i=1;
LNode *p,*tail=L;
while(i<=m){
p=new LNode;
p->number=i;
p->next=tail->next;
tail->next=p;
tail=p;
i++;
}
p->next=L->next;
return 1;
}
//删除指定节点后的节点
int DeleteAfterLNode(LinkList &L,LNode *p){
printf("%d\n",p->next->number);
LNode *q=p->next;
p->next=q->next;
q->next=NULL;
free(q);
return 1;
}

请帮忙吧这个程序完善一下,感激不尽!

最佳答案
  • 五星知识达人网友:骨子里都是戏
  • 2021-05-03 16:22

#include<stdio.h>
void josh(int n,int m)


{
int a[1000];
int i,now;
int j;


for(j=0;j<n;j++)
a[j]=j+1;
now=0;


for(j=1;j<n;j++){
i=0;
while(i<m) {
if (a[now]==0) {
++now;
if (now>=n)
now=0;
}
else {
i++;
if(i==m)
a[now]=0;
++now;
if (now>=n)
now=0;
}
}
}
for(j=0;j<n;j++)
if (a[j]!=0)
printf("result is:%d",a[j]);
getchar();
}


void main()
{ int n,m;
do{scanf("%d,%d",&n,&m);
}while(n<=0&&n>1000||m<=0);
josh(n,m);
}
这个简单,只用到数组即可,你的用链表很麻烦,不易看懂。

全部回答
  • 1楼网友:过活
  • 2021-05-03 16:48

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯