约瑟夫环问题。。最好c++语言的。其他语言也可以。

2024-12-02 08:27:10
推荐回答(2个)
回答1:

#include
#include
main()
{
int n,m,i,j,*pa;
printf("please input n and m :\n");
scanf("%d%d",&n,&m);
pa=(int*)malloc(n*sizeof(int));
if(pa==NULL)
{
printf("allocation failure\n");
exit(1);
}
for(i=0;i pa[i]=i+1;
i=0;
while(n>1)
{
i=(i+m-1)%n;
printf("%-4d",pa[i]);
for(j=i+1;j pa[j-1]=pa[j];
n--;
if(i==n)i=0;
}
printf("\nthe winner is:%d\n",pa[0]);
free(pa);
return 0;
}

回答2:

#include#include#define LEN sizeof(struct L)void ERROR();struct L{int num;int key;struct L *next;};int n;int i=0;void ERROR(){printf("ERROR!\n");printf("所用的密码必须还正整数而且m>0 N>0!!!\n");}struct L *creat(int N)//建立动态循环链表(坐成一圈).{struct L *head;struct L *p1,*p2;n=0;p1=p2=(struct L *)malloc(LEN);printf(" 请输入第1个人手里的密码:");scanf("%d",&p1->key);p1->num=1;head=NULL;while(p1->num<=N){n=n+1;if(n==1) head=p1;else p2->next=p1;p2=p1;p1=(struct L *)malloc(LEN);if (n==N){printf(" 最后请输入0来结束密码录入:");}else{printf(" 请输入第%d个人手里的密码:",n+1);}scanf("%d",&p1->key);p1->num=n+1;}p2->next=head;//尾指针指向头指针.return(head);}struct L *LisDelete(struct L *head,int m,int N)//报数为m的退出.{struct L *p,*q;int j=0,k=0;q=p=head;i=i+1;if(p->next==head) return(p);if(m==1){while(knext;k=k+1;}printf("%i 第%d个人退出.\n",i,q->num);m=q->key;p->next=q->next;head=q->next;free(q);} //key=1的处理.else{while(jnext;j=j+1;}q=p->next;p->next=q->next;printf("%d 第%d个人退出.\n",i,q->num);m=q->key;head=p->next;free(q);} //key=其他数的处理.N=N-1;LisDelete(head,m,N);}int main(){ struct L *head;struct L *p; int m,N;printf("******************************************************\n"); printf("约瑟夫环:\n"); printf(" 编号为1,2,3,4…,n的n个人按顺时针方向围坐一圈,每人\n"); printf("持有一个密码(正整数).一开始任选一个正整数作为报数的上\n");printf("限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m\n");printf("时停止.报m的人出列,将他的密码作为新的m值,从他在顺时针\n");printf("方向上的下一人开始重新从1报数,如此下去,直到所有人全部\n");printf("出列为止.编程打印出列顺序.\n");printf("******************************************************\n");printf(" 输入人数:"); scanf("%d",&N);printf(" 输入处值m:");scanf("%d",&m);printf("***********************************\n");if (m<=0||N<=0) { ERROR(); }else { printf(" 过程:\n");head=creat(N);printf("*******************************\n");printf(" 结果:\n");p=LisDelete(head,m,N);printf("%d 第%d个人退出.\n",N,p->num);}printf("***********************************\n");scanf("%d",&m);return 0;}