On 12/4/05, Hampton <hcatlin / gmail.com> wrote: > Here is my solution. Its not the most beautiful thing in the world, but > its effective. [snip] I could not find any fast solution.. -- Simon Strandgaard # Weird Numbers # Simon Strandgaard <neoneye / gmail.com> def divisors(value) ary = [] (value/2).times do |i| div = i + 1 ary << div if value % div == 0 end ary end $bits = [] 32.times do |bit| $bits << 2 ** bit end def has_subset_equal_to(divs, value) pairs = divs.zip($bits) 1.upto(2 ** divs.size - 1) do |i| sum = 0 pairs.each{|div,b| sum+=div if (i&b)>0 } return true if sum == value end false end def find_weird_numbers(range_min, range_max) ary = [] range_min.upto(range_max) do |value| divs = divisors(value) sum = divs.inject(0){|a,b|a+b} ary << [value, divs] if sum > value end res = [] ary.each do |value, divs| if !has_subset_equal_to(divs, value) puts "##{value} is a WEIRD NUMBER" res << value else puts "##{value} is nothing" end end p res end p find_weird_numbers(1, 100)