我正在尝试找到两个3位数字的所有可能产品。当我使用小范围时,我能够在很短的时间内获得输出,但是当范围很大时,它似乎需要很长时间。有没有办法缩短获得结果的时间?
我正在处理的问题是:
“回文数字的读取方式相同。由两个2位数字的乘积组成的最大回文数为9009 = 91×99。
找出由两个3位数字的乘积制成的最大回文。“
a = []
for x in 100..999
for y in 100..999
num = (x * y)
unless a.include? num
a.push num
end
end
end
p a
答案 0 :(得分:2)
这将分别计算100 x 101和101 x 100,即使它们不会被推送到阵列,因为它们已经在其中。
我的数学不好,但也许每次x上升,y的最小范围可以上升,因为那个刚用完了?数学上更好的人可以告诉我这是否会开始缺少数字。
z= 100
for x in 100..999
for y in z..999
num = (x * y)
unless a.include? num
a.push num
end
z = z+1
end
end
我认为这样做可能会使“除非a.include?num”行也不必要。
答案 1 :(得分:0)
你真正尝试做什么,即什么是原始问题,为什么你需要所有这些产品?< / p>
你是打印出来的吗?有人要求你提供每一个具体的清单吗?
如果没有,可能有更好的方法来解决这个问题。例如,如果你想要的只是检查数字X是否是&#34;产品列表中的元素&#34;,你所要做的就是:
range = 100..999
range.any? { |i| range.include?(x / i) }
答案 2 :(得分:0)
查看代码,您可以进行的快速优化是使用集合而不是数组来存储已计算的产品。
由于a
是一个数组,a.include?(num)
必须在返回true / false之前遍历整个元素列表。
如果a
是一个集合,a.include?(num)
将在子线性时间内返回。
示例:
require 'set'
a = Set.new
for x in 100..999
for y in 100..999
num = (x * y)
unless a.include? num
a.add(num)
end
end
end
puts a.to_a.join(", ")
此外,集合的一个不错的属性是它只存储唯一元素,因此以下内容是等效的:
require 'set'
a = Set.new
for x in 100..999
for y in 100..999
num = (x * y)
a.add(num)
end
end
puts a.to_a.join(", ")