庞果网在线编程覆盖数字问题ruby答案

本来以为是一个比较复杂的算法,后来想了想,通过减法和递归就可以轻轻松松解决了。

题目地址:http://hero.pongo.cn/Question/Details?ID=142&ExamID=140


题目详情

给定整数区间[a,b]和整数区间[x,y],你可以使用任意多次a,b之间的整数做加法,可以凑出多少个[x,y]区间内的整数?

输入 a,b,x,y,其中1<= a < b <= 1000000000,  1 <= x < y <= 1000000000。

输出: 用[a,b]内的整数做任意多次加法,可以得到多少个[x,y]内的整数。


例如a = 8, b = 10, x = 3 , y = 20

我们可以得到 [3..20]之间的整数 8, 9, 10, 16 ( 8 + 8), 17(8 + 9), 18(9 + 9), 19(9 + 10), 20(10 + 10),因此输出8。


问:2+3=5 1+4=5 这算1个还是2个?

答:算1次 问你能覆盖多少个不同的数字 [x,y]全覆盖住得话 就是y - x + 1。



废话少说,上代码

class CoverNumber 
  def initialize(a, b, x, y)
    @a, @b, @x, @y = a, b, x, y
    @a_b = (@a..@b).to_a
  end

  def count
    (@x..@y).to_a.select{|i| can_plus_by_a_b(i)}.count
  end

  private
  def can_plus_by_a_b(number)
    return false if number <= 0
    return true if @a_b.include? number
    @a_b.each do |i|
      return true if can_plus_by_a_b(number - i)
    end
    false
  end
end

describe "test cover number" do

  it "should get 8 if a =  8, b = 10, x = 3 , y = 20" do
    cn = CoverNumber.new(8, 10, 3, 20)
    cn.count.should == 8
  end
end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值