From: ThoML Date: 2008-05-05T02:50:14+09:00 Subject: Re: Reverse Divisible Numbers (#161) Hi, Here are two most likely non-working non-solutions that rely on unproven assumptions. (They work for the defined range though. :-) Anyway, I've got a cold and will go to bed now. ------------------------ version 1 # 1089 and 2178 (= 1089 * 2) are the only 4-digit numbers that are # reverse divisible. "Stretch" these numbers (use 10, 89 and 21, 78 as # prefix/suffix) by keeping it reverse divisble. # # As Harry Kakueiki and Marcelo pointed out, this solutions misses certain # numbers. Shame on me. def rdn(limit = 1_000_000) digits = limit.to_s.size nums = {'10' => '89', '21' => '78'} part = ['', *(0..digits).to_a.inject([]) {|a, e| a << ('9' * (e + 1)) << ('0' * (e + 1)) }] part = part.sort_by {|e| e.size} rv = {} 0.upto(digits - 5) do |d| is = d - 4 nums.each do |prefix, suffix| next if (prefix + suffix).to_i > limit part.each do |p| next if p.size < is b = [prefix, p, suffix].join a = b.to_i if a < limit and !rv.has_key?(a) b.reverse! b = b.to_i if b % a == 0 nums[a] = a rv[a] = b end end end end end return rv end if __FILE__ == $0 limit = (ARGV[0] || 1_000_000).to_i nums = rdn(limit).sort_by {|a, b| b} nums.each do |a, b| puts "#{b} = #{a} * #{b / a}" end puts "Found #{nums.size} numbers" end ------------------------ version 2 # Assumptions: # - The start value is 8712 # - Any number can be divided by 99 (3**2 * 11) # - The last digit has to be 1 or 2 def rdn(limit) rv = [] 8712.step((limit || 1_000_000).to_i, 99) do |i| r = i % 10 next if r != 1 and r != 2 j = i.to_s.reverse.to_i d, r = i.divmod(j) if r == 0 and d > 1 v = [j, d, i] puts "%s * %s = %d" % v rv << v end end return rv end if __FILE__ == $0 limit = ARGV[0] || 1_000_000 nums = rdn(limit) puts "Found #{nums.size} numbers" end