程序员的算法趣题Q03: 翻牌

目录

1. 问题描述

2. 解题思路


1. 问题描述

        有100张写着数字1~100的牌,并按顺序排列着。最开始所有牌都是背面朝上放置。某人从第2张牌开始,隔一张牌翻牌。然后第2,4,。。。100张牌就会翻为朝上。接下来,第2个人从第3张牌开始,每隔2张牌翻一张;第3个人从第4张牌开始,每隔3张牌翻一张;。。。这样一直继续下去,直到最后没有牌可翻了。

        请问,最终所有背面朝上的牌的数字。

2. 解题思路

        这是一道有名相当于小学高年级或初中低年级的奥数竞赛级别的数学趣味题。

        因为初始状态是背面朝上,所以最终仍然背面朝上的牌一定是经过了偶数次(0,2,4,。。。)翻转。

        站在第m张牌的角度来看,在第k轮(即从第k+1张牌开始每隔k张翻一张)翻牌中,只有当m能够被k整除(代数中通常记为k|m)时,第m张牌才会被翻转。这就意味着,第m张牌如果在最终是背面朝上,则必然是有偶数个除1以外的因子(含自己)。

        由初等数论的知识可知,一个整数在进行因数分解时,其因子是成对出现的(比如说8的因子,有2和4是一对,1和8是一对),只有一种情况例外,即该数是完全平方数,比如说n = m^2,此时m作为n的因子是单独出现(它与自己成对,只能算做一个)。所以,一个整数只有在它是完全平方数的时候,才会有总共(含1和自己)奇数个因子,也即除1以外有偶数个因子。

        基于以上分析,可以直到,最终仍然保持背面朝上的牌的序号必然是完全平方数。因此本题转变成了求100以内的完全平方数,答案也就显而易见恰好1~10的平方:1,4,9,16,25,36,49,64,81,100

        上一篇:Q02: 四则运算组合游戏

        下一篇:Q04: 切分木棒

        本系列总目录参见:程序员的算法趣题:详细分析和Python全解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨牛慢耕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值