C語言陣列實現約瑟夫環出圈問題 程式碼詳細註釋 簡單易懂

。◕‿◕。。◕‿◕。發表於2020-12-14

如果沒理解,那手動模擬一遍,就懂了!

#include<stdlib.h>
#define N 10

void Joseph(int p[],int n,int s,int m);
void main(){
	int p[N],s,m,i;	//s為從第幾個開始報數,m為報到第幾個人出隊
	printf("請輸入從第幾個人開始報數,第幾個人出隊:");
	scanf("%d%d",&s,&m);
	Joseph(p,N,s,m);
	for(i=N-1;i>=0;i--){
		printf(" %4d",p[i]);
	}
}
void Joseph(int p[],int n,int s,int m){
	int i,j,s1=s,temp;
	for(i=1;i<=n;i++){	//n個人迴圈編上號
		p[i-1]=i;
	}
	for(i=n;i>=2;i--){	//用i控制沒出去圈的總人數
		s1=(s1+m-1)%i;	//找出出圈報數人的位序
		if(s1==0)	//如果s1為0說明最後一個人報的數,它的序號是i
			s1=i;
		temp=p[s1-1];	//暫存出隊人對應陣列中的值
		for(j=s1;j<i;j++){	//出隊人後的人依次往前一位
			p[j-1]=p[j];
		}
		p[i-1]=temp;	//出隊人的值放在陣列最後
	}	
}

相關文章