12通过添加自然数生成三角数序列。所以第7个三角形数字是1 + 2 + 3 + 4 + 5 + 6 + 7 = 28.前十个术语是:
1,3,6,10,15,21,28,36,45,55,......
让我们列出前七个三角形数字的因子:
我们可以看到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
答案 0 :(得分:1)
我们当然应该使用Ruby提供的相关方法。在这种情况下,一个这样的(类)方法是Prime::prime_division。例如,
require 'prime'
Prime.prime_division(2106)
#=> [[2, 1], [3, 4], [13, 1]]
这告诉我们2106有素数2
,3
和13
,而且
2**1 * 3**4 * 13**1
#=> 2106
2106
有多少因素?每个因素都是
2**a * 3**b * 13**c
其中0 <= a <= 1
,0 <= b <= 4
,0 <= c <= 1
。其中包括a = b = c = 0
,因子为1
和a, b, c = 1, 4, 1
,因子为2106
。因此,因子的数量等于
(1+1) * (4+1) * (1+1)
#=> 20
也就是说,2
包括0
或1
} 3
,0
和4
之间可以包含13
}次,对于这10对中的每一对,0
可以包含1
或45
次。
举一个更简单的例子,考虑三角形数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]