對於編碼挑戰,我嘗試找到達到給定限制的倍數之和。如果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。
但是,問題沒有解決。如何創建一個動態條件,包括or
或and
以測試n個給定值?
這不回答你的問題,但你的代碼可能更有效率。如果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
@DaveGalvin感謝您的反饋。可以肯定的是,我不是數學中的王牌,但我相信我會找到一些有用的資源來改進我的劇本 - 感謝你的建議。 –