moset的个人博客分享 http://blog.sciencenet.cn/u/moset 以心为绢,绘山河;以思为海,汇百流;以文为宴,会高朋。

博文

曾经的报数游戏

已有 4920 次阅读 2012-6-19 19:46 |系统分类:生活其它| 游戏, 数数

    中午逛论坛,看到这么一个有关吃饭喝酒数数的问题。一圈人围一桌,开始报数,每次加一,遇到某个数的倍数时,拍桌子,若是不小心说出了这个数就罚酒。很多人都可能玩过类似的游戏。回想,曾经玩的时候,搞得老紧张,不过估计也没啥机会玩这种游戏了。

    既然勾起了一些回忆,那便一劳永逸的解决这个问题好了。假设,一桌酒友有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)=6mod(-8,10)=2=>mod(K*3+1,5)=0,容易看出K=3时就成立。

K1K2…间隔是 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; 得到2610…

result=Iround(16,8,12)

result =

     2     6    10    14    18    22    26    30



https://blog.sciencenet.cn/blog-567861-583819.html

上一篇:色彩空间笔记
下一篇:关于整数拆分的几个Matlab函数
收藏 IP: 59.46.83.*| 热度|

2 丁大勇 赵凤光

该博文允许注册用户评论 请点击登录 评论 (2 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-27 09:48

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部