约瑟夫环问题 c语言程序
设有n个人围坐一圈,从某个人开始报数,数到m的人出列,接着下从下一个人开始从新报数,数到m的人又出列,直到所有的人出列为止。输出出队列的顺序。
[具体要求]
(1)要求建立一个由n个人围坐的一个圈(链式循环队列),编号依次为1、2、...、n
(2)从第i个人开始报数,数到m的人出列
(3)人数n、初始报数人编号、m的值由
#include <stdio.h>
#define S() sizeof(struct quene)
typedef struct quene
{ int n;
struct quene *next;
} QUE;
QUE * fun1(int n);
int fun2(QUE *p);
int main()
{ int m,i,n,j,s;
QUE *p,*p2;
printf("n=");
scanf("%d",&n);
printf("m=");
scanf("%d",&m);
printf("i=");
scanf("%d",&i);
p=fun1(n);
for(j=1;j<i;p=p->next,j++);
j=1;p2=p;
while((p->next)!=p)
{ p=p->next;
if(++j==m)
{ j=1;p=p->next;
s=fun2(p2);
printf("%d ",s);
}
p2=p;
}
printf("%d\n",p->n);
}
QUE * fun1(int n)
{ QUE *head,*p1,*p2;
int i;
for(i=1;i<=n;i++)
{ p1=(QUE *)malloc(S());
if(i==1) head=p1;
else p2->next=p1;
p1->n=i;
p2=p1;
}
p1->next=head;
return head;
}
int fun2(QUE *p)
{ QUE *p2;
int n;
p2=p->next;
n=p2->n;
p->next=p2->next;
free(p2);
return n;
} 展开
已经修改好了。上次调试程序调试的不仔细,这次应该没问题了,如果有的话再跟我联系。
#include <stdio.h>
#define S() sizeof(struct quene)
typedef struct quene
{ int n;
struct quene *next;
} QUE;
QUE * fun1(int n);
int fun2(QUE *p);
int main()
{ int m,i,n,j,s;
QUE *p,*p2;
printf("n=");
scanf("%d",&n);
printf("m=");
scanf("%d",&m);
printf("i=");
scanf("%d",&i);
p=fun1(n);
for(j=1;j<i;p=p->next,j++);
j=1;p2=p;
while((p->next)!=p)
{ p=p->next;
if(++j==m)
{ j=1;p=p->next;
s=fun2(p2);
printf("%d ",s);
}
p2=p;
}
printf("%d\n",p->n);
}
QUE * fun1(int n)
{ QUE *head,*p1,*p2;
int i;
for(i=1;i<=n;i++)
{ p1=(QUE *)malloc(S());
if(i==1) head=p1;
else p2->next=p1;
p1->n=i;
p2=p1;
}
p1->next=head;
return head;
}
int fun2(QUE *p)
{ QUE *p2;
int n;
p2=p->next;
n=p2->n;
p->next=p2->next;
free(p2);
return n;
}
int yuesefu1(int data[],int sum,int k)
{
int i=0,j=0,count=0;
while(count<sum-1)
{
if(data[i]!=0)/*当前人在圈子里*/
j++;
if(j==k)/*若该人应该退出圈子*/
{
data[i]=0;/*0表示不在圈子里*/
count++;/*退出的人数加1*/
j=0;/*重新数数*/
}
i++;/*判断下一个人*/
if(i==sum)/*围成一圈*/
i=0;
}
for(i=0;i<sum;i++)
if(data[i]!=0)
return data[i];/*返回最后一个人的编号*/
}
void main()
{
int data[N];
int i,j,total,k;
printf("\nPlease input the number of every people.\n");
for(i=0;i<N;)/*为圈子里的人安排编号*/
{
int input;
scanf("%d",&input);
if(input==0)
break;/*0表示输入结束*/
for(j=0;j<i;j++)/*检查编号是否有重复*/
if(data[j]==input)
break;
if(j>=i&&input>0)/*无重复,记录编号,继续输入*/
{
data[i]=input;
i++;
}
else
printf("\nData error.Re-input:");
}
total=i;
printf("\nYou have input:\n");
for(i=0;i<total;i++)
{
if(i%10==0)
printf("\n");
printf("%4d",data[i]);
}
printf("\nPlease input a number to count:");
scanf("%d",&k);
printf("\nThe last one's number is %d",yuesefu1(data,total,k));
}