約瑟夫環的分析

假設下標從0開始,0,1,2 .. m-1共m個人,從1開始報數,報到k則此人從環出退出,問最後剩下的一個人的編號是多少?

現在假設m=10

0 1 2 3  4 5 6 7 8 9    k=3

第一個人出列後的序列爲:

0 1 3 4 5 6 7 8 9

即:

3 4 5 6 7 8 9 0 1(A)

我們把該式轉化爲:

0 1 2 3 4 5 6 7 8 (B)

則你會發現: ((B)+3)%10則轉化爲(A)式了

也就是說,我們求出9個人中第9次出環的編號,最後進行上面的轉換就能得到10個人第10次出環的編號了 

設f(m,k,i)爲m個人的環,報數爲k,第i個人出環的編號,則f(10,3,10)是我們要的結果

當i=1時,  f(m,k,i) = (m+k-1)%m

當i!=1時,  f(m,k,i)= ( f(m-1,k,i-1)+k )%m

所以程序如下:

int fun(int m,int k,int i){
 
    if(i==1)
        return (m+k-1)%m;
    else
        return (fun(m-1,k,i-1)+k)%m;
 
}
int main(int argc, char* argv[])
{
    int i;
    for( i=1;i<=10;i++)
        printf("第%2d次出環:%2d\n",i,fun(10,2,i));
    return 0;
}


若只需要求最後一個數,則更改爲
int fun(int m,int k,int i){
 
    if(i==1)
        return (m+k-1)%m;
    else
        return (fun(m-1,k,i-1)+k)%m;
 
}
int main(int argc, char* argv[])
{
    int m,k;
	scanf("%d %d",&m,&k);
    
        printf("%d個數形成環,報數爲%d的出列,最後一個在數組中的位置是%d\n",m,k,fun(m,k,m));
    return 0;
}


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