2015-10-14 76 views
1

對於編碼挑戰,我嘗試找到達到給定限制的倍數之和。如果x可以被1,2或n個數整除

倍數應該是可配置的 - 不僅是它們的值,還有它們的數量。

假設我應該找的7一9的倍數高達255的限制,這是我做的:

(0..255).select do |i| 
    i % 7 == 0 || i % 9 == 0 
end.inject(:+) 

會發生什麼:從符合我的條件是一個數組我select所有整數。然後我返回總和操作,返回倍數之和。很棒。

這裏是我想要做什麼:

divisors = [7,9,13] 

(0..255).select do |i| 
    divisors.each do |d| 
    i % d == 0 
    end 
end.inject(:+) 

我所期待發生:一個數組的所有整數select版匹配each迭代裏面的條件。

這就是你的失誤後絆倒如何在寫一個問題: 顯然divisors.each {|d| condition }不起作用一樣我||操作和選擇將盡快我i%d==0的一個失敗返回false。

但是,問題沒有解決。如何創建一個動態條件,包括orand以測試n個給定值?

+1

這不回答你的問題,但你的代碼可能更有效率。如果k是除數的數量,n是所考慮數字的上限,則算法爲O(n * k)。例如,假設你有1個數字:d,你的上限是L.那麼你想要d + 2d + 3d + ... + md,其中m = floor(L/d)。這等於d *(1 + 2 + ... + m)= d * m *(m + 1)/ 2.以O(1)完成。對於k = 2,你可以在O(1)中得到更多的工作。較大的k需要一些我不會打擾的想法,因爲這不是你的問題。 – Dave

+0

@DaveGalvin感謝您的反饋。可以肯定的是,我不是數學中的王牌,但我相信我會找到一些有用的資源來改進我的劇本 - 感謝你的建議。 –

回答

2

使用Array#mapEnumerable#any?

divisables.map do |d| 
    i % d == 0 
end.any? 

HTH

編輯:另外,作爲@undur_gongor說,你還可以用像any?

divisables.any? { |d| i % d == 0 } 
+3

與'divisables.any?'功能不同嗎? {| d |我%d == 0}'但效率較低? –

+0

@undur_gongor,是的你是對的。它沒有發生在我身上。發佈編輯。 –

相關問題