关于约瑟夫问题的数学解答。

约瑟夫问题的数学解答:

 

假设一组n个数的序号为:1、2、3…n

令f(n,i)=x 为第i号的数为x

令k为每次淘汰的序号

 

那么我们可以知道对于上面组可以转换为

注意:if((k=k%n)==0)k=n.

k+1、k+2…n、1、2…k-1、k(已经被踢掉)

 

这组对应的序号我们可以找到

1、2…n-k、n-k+1、n-k+2…n-1

 

我们总结出公式:

f(n-1,i)=  f(n,i+k) ; {1<=i<=n-k}

  f(n,i-n+k); {n-k< i <=n-1}

 

其实我们可以简化一下:

if((j=(i+k)%n)==0)j=n;

f(n-1,i) = f(n,j);

 

从上面的推导我们可以看出,如果知道f(n,j),

我们就可以求出f(n-1,i)。

 

由于最初的一组数肯定满足f(n,i)=i。

于是我们可以明白要求出最后一个数,

那么肯定是有最开始的数决定。

 

假设有n个人,每次淘汰序号为k.

for(i=2,s=1;i<=n;i++)//逆向求解

if((s=(s+k)%i)==0)s=i;

 

由于f(n,i)=i,所以最后求出的s即为f(1,1)。

 

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/cug_fish_2009/article/details/6507105
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞