项目欧拉#12

时间:2017-03-11 17:05:15

标签: ruby

12通过添加自然数生成三角数序列。所以第7个三角形数字是1 + 2 + 3 + 4 + 5 + 6 + 7 = 28.前十个术语是:

1,3,6,10,15,21,28,36,45,55,......

让我们列出前七个三角形数字的因子:

  • 1:1
  • 3:1,3
  • 6:1,2,3,6
  • 10:1,2,5,10
  • 15:1,3,5,15
  • 21:1,3,7,21
  • 28:1,2,4,7,14,28

我们可以看到28是第一个超过五个除数的三角形数。

第一个三角形数的值超过500个除数是多少?

定义一个列出数字因子的方法 迭代序列直到找到具有500个因子的三角形 返回有500个因子的数字 if factors.count == 500

def factors(num)
  current_number = 1 
  factors_list= []
  while current_number <= num
    if is_factor(num,current_number)
      factors_list << current_number
    end
    current_number += 1 
  end
  return factors_list
end

def is_factor(big,small)
  if big % small == 0 
    return true 
  else 
    false 
  end
end     

def big_triangle(num) #500
  triangles = [1]
  natural_numbers = 1
  while factors(natural_numbers).count != num 
    triangles << natural_numbers
    natural_numbers += 1     
  end
  triangles.select { |n| factors(n).count == num }
end

1 个答案:

答案 0 :(得分:1)

我们当然应该使用Ruby提供的相关方法。在这种情况下,一个这样的(类)方法是Prime::prime_division。例如,

require 'prime'

Prime.prime_division(2106)
  #=> [[2, 1], [3, 4], [13, 1]]

这告诉我们2106有素数2313,而且

2**1 * 3**4 * 13**1
  #=> 2106

2106有多少因素?每个因素都是

的形式
2**a * 3**b * 13**c

其中0 <= a <= 10 <= b <= 40 <= c <= 1。其中包括a = b = c = 0,因子为1a, b, c = 1, 4, 1,因子为2106。因此,因子的数量等于

(1+1) * (4+1) * (1+1)
  #=> 20

也就是说,2包括01} 304之间可以包含13 }次,对于这10对中的每一对,0可以包含145次。

举一个更简单的例子,考虑三角形数Prime.prime_division(45) #=> [[3, 2], [5, 1]]

(2+1) * (1 + 1)
  #=> 6

因此,因子的数量是

3**0 * 5**0 #=>  1
3**0 * 5**1 #=>  5 
3**1 * 5**0 #=>  3 
3**1 * 5**1 #=> 15 
3**2 * 5**0 #=>  9 
3**2 * 5**1 #=> 45 

这些因素是

def nbr_factors(n)
  Prime.prime_division(n).reduce(1){ |t,(_,m)| t * (m+1) }
end

nbr_factors(2106)
  #=> 20
nbr_factors(45)
  #=> 6

我们可以写

def first_triangle_nbr_with_min_nbr_divisors(min_nbr_divisors)
  tri = 0
  1.step.each do |i|
    tri += i
    break tri if nbr_factors(tri) >= min_nbr_divisors
  end
end

first_triangle_nbr_with_min_nbr_divisors   6 #=>         28
first_triangle_nbr_with_min_nbr_divisors  20 #=>        528
first_triangle_nbr_with_min_nbr_divisors 501 #=> 76_576_500

现在可以很容易地获得所需的结果。

...
i=12372, tri=76539378, nbr_factors(tri)=16
i=12373, tri=76551751, nbr_factors(tri)=8
i=12374, tri=76564125, nbr_factors(tri)=96
i=12375, tri=76576500, nbr_factors(tri)=576

最后一个例子的最后几个计算如下。

 [ErrorException]