首页 新闻 会员 周边

一个费解的算法

0
悬赏园豆:30 [已解决问题] 解决于 2009-03-20 14:02

关于约瑟夫环问题
17人围成一圈,一次报数,报到3的倍数的人剔除队列,剩下的人继续接前面的号数报下去(比如说17号报到17后1号应该接着报18)。
求最后剩下的那个人的编号。
有个高人写了这样一个让我很费解的算法:
int x = 0;
for (int i = 2; i <= 17; i++)
{
x = (x + 3) % i;
}
Console.WriteLine(x);
谁能帮我分析分析?

Joey[Lin]的主页 Joey[Lin] | 初学一级 | 园豆:170
提问于:2009-03-20 09:41
< >
分享
最佳答案
0
半克拉鹅卵石 | 菜鸟二级 |园豆:255 | 2009-03-20 11:35
其他回答(2)
0

反正这高人写的肯定是错的,请无视之

Gray Zhang | 园豆:17610 (专家六级) | 2009-03-20 12:08
0

你给的所谓约瑟夫环的定义就不对,按照你的定义,我写了一个函数:

        static int JosephusCycle(int n, int m)
        {
            int x = 0;
            int mod = 0;

            while (n > 1)
            {
                x += n;

                int div = (n + mod) / m;
                mod = div > 0 ? (n + mod) % m : mod + ((n + mod) % m);
                n -= div;
            }

            return x;
        }

实际的约瑟夫环的定义是编号为1,2,3,……,n的n个人按顺时针方向围坐一圈。任选一个正整数作为报数上限m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。设计程序输出出列顺序。

即报到3的人退出后,报数重置了,重新从1开始报,你给的那个高人的代码是按照这个定义做的,高人写的是没有错的。

 

 

eaglet | 园豆:17139 (专家六级) | 2009-03-20 14:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册