約瑟夫問題I

題目描述(這裏用數組做的比較容易出錯,建議用鏈表或者遞歸做)

約瑟夫問題是一個非常著名的趣題,即由n個人坐成一圈,按順時針由1開始給他們編號。然後由第一個人開始報數,數到m的人出局。現在需要求的是最後一個出局的人的編號。

給定兩個int nm,代表遊戲的人數。請返回最後一個出局的人的編號。保證n和m小於等於1000。

測試樣例:
5 3
返回:4
class Joseph {
public:
	int getResult(int n, int m)
	{
		int *a=new int[n];
		m=m-1;
		memset(a,0,n*sizeof(int));
		int step=0,num=0;//num記錄訪問過的數據個數;
		int j=0;//j記錄重新開始的位置,初始爲零;
		while(num<n-1)
		{      
			while(step<m)
			{
				if(a[j%n]==0)//表示未訪問過;
					step++;
				j++;
			}
			while (a[j%n]==1)//此位已經訪問過;
			{
				j++;
			}
			a[j%n]=1;
			step=0;
			num++;
		}
		for(int k=0;k<n;k++)
		{
			if(a[k]==0)
			{
				delete[] a;
				return k+1;//返回j的位置;
			}
			
		}
	}
};

題目描述(二)(未完成)

約瑟夫問題是一個著名的趣題。這裏我們稍稍修改一下規則。有n個人站成一列。並從頭到尾給他們編號,第一個人編號爲1。然後從頭開始報數,第一輪依次報1,2,1,2...然後報到2的人出局。接着第二輪再從上一輪最後一個報數的人開始依次報1,2,3,1,2,3...報到2,3的人出局。以此類推直到剩下以後一個人。現在需要求的即是這個人的編號。

給定一個int n,代表遊戲的人數。請返回最後一個人的編號

發佈了41 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章