2014-09-10 101 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