||
既然勾起了一些回忆,那便一劳永逸的解决这个问题好了。假设,一桌酒友有pn人,我的位置是mp,数的数是ln的倍数,写了下面这个小程序:
function result=Iround(pn,mp,ln)
L=mod(0:ln*30-1,pn)+1;
re=reshape(L,[ln,30]);
result=find(re(ln,:)==mp);
end
我们其实不用知道自己会数到什么数字,生硬的计算,即便简单,在紧张的场合,也往往会犯错的,只要我们知道自己会在第几次报数的时候该拍桌子就好了,例如,我知道我会是第4个拍桌子的人,前3次的时间只要跟着前面的人数数,无压力,然后准备拍桌子就可以了。
运行程序
result=Iround(10,8,6)
result =
3 8 13 18 23 28
10个酒友,我在第8个位置,数6的倍数。结果是第3次、第8次……
回合的间隔为5。
简单的说就两个过程:
若我第K次报数时须拍桌,那么:
mod(K*ln-mp , pn)=0,如上例,mod(K*6-8 , 10)=0 那么K=3 、8……,
等同于过程:
mod(6,10)=6,mod(-8,10)=2=>mod(K*3+1,5)=0,容易看出K=3时就成立。
另K1,K2…间隔是 pn/gcd(pn,ln),上例中 10/gcd(10,6)=5。
例:pn=16, mp=8, ln=12,
mod(K*12-8,16)=0 => mod(K*12+8,16)=0=>mod(K*3+2,4) =>K=2 即可,间隔 16/gcd(16,12)=4; 得到2、6、10…。
result=Iround(16,8,12)
result =
2 6 10 14 18 22 26 30
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-22 13:55
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社