您的位置:首页 > 编程语言 > C语言/C++

C语言,数组实现约瑟夫环问题(两种方法)

2011-11-16 20:24 816 查看
约瑟夫环问题:约瑟夫环是一个数学的应用问题:已知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
=-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;

}


运行结果如下,



希望对各位有用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: