假設下標從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;
}