所有可能的产品

时间:2014-09-10 20:01:28

标签: ruby

我正在尝试找到两个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

3 个答案:

答案 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(", ")