2014-09-10 103 views
0

我试图找到两个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

量子计算,我想。 “真的很长”有多久?对于'x'和'y'的值是什么? – iamnotmaynard 2014-09-10 20:07:01

+0

参见http://stackoverflow.com/questions/487258/plain-english-explanation-of-big-o(不是真的重复,但应该有你的答案)。 – iamnotmaynard 2014-09-10 20:08:06

+0

x的取值范围也是100和999. y的取值范围是100到999.我希望能在一分钟内得到结果。 – sjk2426 2014-09-10 20:09:48

回答

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(", ") 
+0

这很完美!我刚开始自学自己的红宝石,并没有读“关于”设置。非常感谢! – sjk2426 2014-09-10 20:25:58

2

这是要计算100×101和101×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”行也是不必要的。

0

什么是你真正试图做,即什么是原来的问题为什么你需要这些产品吗?

你正在打印每一个?有人问你每一个具体的清单吗?

如果没有,可能有更好的方法来处理这个问题。例如,如果你希望所有的检查,如果有很多X将在“产品该列表”的元素,所有你需要做的是:

range = 100..999 
range.any? { |i| range.include?(x/i) } 
+0

这是原始问题: “回文数字读取方式相同,由两个2位数字的乘积制成的最大回文数为9009 = 91×99. 查找由两个3的乘积组成的最大回文数数字“。 – sjk2426 2014-09-10 20:19:57

+0

那么是的,有_definitely_更聪明的方法来做到这一点。首先,你正在创建_and存储_每个产品的数组。您是否可以考虑一种方法,一次一个地验证产品的回文,而不需要存储整个产品列表? – Kache 2014-09-10 20:22:10

+0

此外,既然您正在寻找“最大的回文”,为什么不从999到100后退?事实上,你可以做999到900,看看你是否在那里找到回文。 – Kache 2014-09-10 20:28:46