设: 上次出局人是 x 偏移量是 p 当前总人数是 n 则下一个出局者就是 y=(x+p)%n
这个是正常的算法 然后是 逆推理
设 : 本次出局人是 x 偏移量是p 上次总人数是n 则上次出局人就是讲x 与 y 调换位置
x = (y+p)%n
设: x是最后一个留下的人 出上一个人的位置y 关系为
x = (y+p)%2
设: x是倒数第二个人 上一个人的位置y 关系为
x = (y+p)%3
设:已知 当前出局人位置 y 出局人数和 n 偏移量p 求 O 次后的出局人位置
while( O-1) //因为x就是循环之后的位置 所以进行O-1次循环就是O次循环之后的
{
x = (y+p)%n // x 就是这次的出局位置 然后是再次赋值
y = x;
n = n+1;
}
最后x的值就是 y 循环 O 次以后的值
由于编程语言的特殊赋值性 可以这样写
while( O-1) //因为x就是循环之后的位置 所以进行O-1次循环就是O次循环之后的
{
y = (y+p)%n++ // y 就是这次的出局位置 然后是再次赋值
}
然后将 n ++ 提取到 for循环
for( ; 循环O-1次;n++)
y = (y+p)%n
然后因为是第二次开始
for( n=2; 循环O-1次;n++)
y = (y+p)%n
然后控制循环99次
for( n=2; n经过99次循环;n++)
y = (y+p)%n
for( n=2; n<101;n++)
y = (y+p)%n作者: 殷俊 时间: 2015-3-25 11:47