我一直在嘗試對 codewars 進行以下測驗。我對編碼相對較新,將尋找更合適的解決方案,并詢問您對我的代碼的反饋。我已經在底部撰寫了解決方案,我一生都無法理解缺少什么,因為結果數字始終為 0。我非常感謝對我的問題代碼的反饋,而不僅僅是為問題提供最佳解決方案. 雖然兩者都將不勝感激。先感謝您!
提出的測驗是:
如果我們列出所有 10 以下的自然數是 3 或 5 的倍數,我們會得到 3、5、6 和 9。這些倍數之和是 23。
完成該解決方案,使其回傳傳入數字以下所有 3 或 5 倍數的總和。此外,如果數字為負數,則回傳 0(對于具有它們的語言)。
注意:如果數字是3和5的倍數,只計算一次。
我的代碼如下:
def solution(number)
array = [1..number]
multiples = []
if number < 0
return 0
else
array.each { |x|
if x % 3 == 0 || x % 5 == 0
multiples << x
end
}
end
return multiples.sum
end
uj5u.com熱心網友回復:
在這種情況下,當您的代碼中的某些內容產生意外結果時,您應該對其進行除錯,這意味著使用相同的引數逐行運行它并查看每個變數的內容。使用某種互動式控制臺來運行代碼(如 irb)非常有幫助。轉到您的示例,讓我們從頭開始:
number = 10
array = [1..number]
puts array.size # => 1 - wait what?
puts array[0].class # => Range
如您所見,該array變數不包含數字,而是包含一個 Range 物件。過濾完陣列后,結果是一個總和為 0 的空陣列。 盡管如此
,Ruby 有很多內置方法可以幫助您解決相同的問題,只需鍵入更少的單詞,例如:
multiples_of_3_and_5 = array.select { |number| number % 3 == 0 || number % 5 == 0 }
在撰寫多行代碼塊時,更喜歡使用do, end語法,例如:
array.each do |x|
if x % 3 == 0 || x % 5 == 0
multiples << x
end
end
uj5u.com熱心網友回復:
我并不是說這本身就是最好的方法,但是使用您的特定代碼,您可以通過以下兩種方式之一編輯代碼的第一行來解決 MAIN 問題:
通過將您的轉換range為array. 像這樣的事情可以解決問題:
array = (1..number).to_a
或僅使用陣列的范圍 INSTEAD ,如下所示:
range = 1..number
插入到您的代碼中的后一種解決方案可能如下所示:
number = 17
range = 1..number
multiples = []
if number < 0
return 0
else range.each{|x|
if x % 3 == 0 || x % 5 == 0
multiples << x
end
}
end
multiples.sum
#=> 60
uj5u.com熱心網友回復:
return 后面的陳述句end表明您正在撰寫一個方法,但def缺少該陳述句。我相信應該是
def tot_sum(number, array)
multiples = []
if number < 0
return 0
else array.each{|x|
if x % 3 == 0 || x % 5 == 0
multiples << x
end
}
end
return multiples.sum
end
但是,正如您指出的那樣,這會重復計算 15 的倍數。
讓我建議一種更有效的寫作方式。首先考慮不超過給定數字的 3 倍數的數字之和n。
認為
n = 3
m = 16
那么不超過 16 的三的倍數的總和可以計算如下:
3 * 1 3 * 2 3 * 3 3 * 4 3 * 5
= 3 * (1 2 3 4 5)
= 3 * 5 * (1 5)/2
= 45
這利用了5 * (1 5)/2等于代數級數之和的事實:(1 2 3 4 5)。
我們可以撰寫一個輔助方法來計算任何 number 的總和n,它m是 的倍數n不能超過的數:
def tot_sum(n, m)
p = m/n
n * p * (1 p)/2
end
例如,
tot_sum(3, 16)
#=> 45
我們現在可以撰寫一個給出所需結果的方法(記住我們需要考慮 15 的倍數是 3 和 5 的倍數):
def tot(m)
tot_sum(3, m) tot_sum(5, m) - tot_sum(15, m)
end
tot( 9) #=> 23
tot( 16) #=> 60
tot(9999) #=> 23331668
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/404413.html
標籤:
