題目描述(這裏用數組做的比較容易出錯,建議用鏈表或者遞歸做)
約瑟夫問題是一個非常著名的趣題,即由n個人坐成一圈,按順時針由1開始給他們編號。然後由第一個人開始報數,數到m的人出局。現在需要求的是最後一個出局的人的編號。
給定兩個int n和m,代表遊戲的人數。請返回最後一個出局的人的編號。保證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,代表遊戲的人數。請返回最後一個人的編號