约瑟夫环问题:约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
第一种方法:要求将每次出列的人的序号输出,并输出最后一个出列的人。
代码如下:
//c语言用数组实现约瑟夫环
#include<stdio.h>
#include<stdlib.h>
void main()
{
int y(int n,int m);
int p,q,r;
printf("请输入参选人的个数p和开始的位置q:\n");
scanf("%d%d",&p,&q);
r=y(p,q);
printf("最后那个人的初始位置是:%d\n",r);
}
int y(int n,int m)
{
int i,j=0,s=0,l;
int *a=(int *)malloc(sizeof(int));
int *b=(int *)malloc(sizeof(int));
for(i=0;i<n;i++)
{
a[i]=i+1;
}
a[n]=-1;
for(i=0;j!=n;i++)
{
if(a[i]==-1)
i=0;
if(a[i]!=0 && a[i]!=-1)
s++;
if(s==m)
{
b[j]=a[i];
a[i]=0;
j++;
s=0;
}
}
for(i=0;i<n;i++)
{
printf("%5d",b[i]);
}
printf("\n");
l=b[n-1];
return l;
}
运行结果如下,
第二种方法:只要求出最后出列的那个人的位置即可
这种方法利用了约瑟夫环的公式,用到了递归,相对简单。
代码如下,
#include<stdio.h>
void main()
{
int y(int n,int m);
int a,b,c;
scanf("%d%d",&a,&b);
c=y(a,b);
printf("最后一个数为:%d\n",c);
}
int y(int n,int m)
{
int x;
if(n==1)
x=1;
else
{
x=(y(n-1,m)+m)%n;
if(x==0) x=n;
}
return x;
}
运行结果如下,
希望对各位有用。