1. 程式人生 > >C語言,陣列實現約瑟夫環問題(兩種方法)

C語言,陣列實現約瑟夫環問題(兩種方法)

約瑟夫環問題:約瑟夫環是一個數學的應用問題:已知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;
	
}


執行結果如下,

希望對各位有用。