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

Q03——翻牌

这里有 100 张写着数字 1~100 的牌,并按顺序排列着。最开始所有
牌都是背面朝上放置。某人从第 2 张牌开始,隔 1 张牌翻牌。然后第 2,
4, 6, …, 100 张牌就会变成正面朝上。
接下来,另一个人从第 3 张牌开始,隔 2 张牌翻牌(原本背面朝上
的,翻转成正面朝上;原本正面朝上的,翻转成背面朝上)。再接下来,
又有一个人从第 4 张牌开始,隔 3 张牌翻牌。
像这样,从第 n 张牌开始,每隔 n- 1 张牌翻牌,直到没有可翻动
的牌为止。
|    |   |   |  |  |  |  |  |  |  | ...| | 2 | | 4 | | 6 | | 8 | ...| | 2 | 3 | 4 |   |   |   | 8 | 9 |...| | 2 | 3 |   |   |  |   | | 9 |......
问题:求当所有牌不再变动时,所有背面朝上的牌的数字。

思路:只要根据问题描述,按顺序对牌进行翻转处理就可以了。用数组保
存牌的状态,如果牌正面朝上,则设置值为 true,反之为 false。这样一
来,我们就可以简单地模拟翻转操作了。用 Ruby 时,可以用下面这个
程序来实现。

# 初始化卡牌
N = 100
cards = Array.new(N, false)

# 从2到N翻牌
(2..N).each{|i|
  j = i - 1
  while (j < cards.size) do
    cards[j] = !cards[j]
    j += i
  end
}

# 输出背面朝上的牌
N.times{|i|
  puts i + 1 if !cards[i]
}

上述代码是用数组来实现的,但从左到右按顺序处理也就意
味着“已经翻转过的部分不再翻转”。如果针对这一点进行优化,还可
以继续简化程序,具体代码如下。

(1..100).each{|i|
  flag = false
  (1..100).each{|j|
    if i % j == 0 then
      flag = !flag
    end
  }
  puts i if flag
}

答案:1,4,9,16,25,36,49,64,81,100

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

柚纸君@blog

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

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

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

打赏作者

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

抵扣说明:

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

余额充值