我是 Ruby 編程語言的初學者。所以,我試圖在 Ruby 中獲得這個輸出。但我不知道如何完成這項任務。
當用戶輸入像“123456789”這樣的輸入時,第1步。我想先做一對這樣的“12 34 56 78 9”第2步。然后像這樣“3 7 11 15 9”這樣單獨添加每對的值第3步。然后制作一對像“3711159”這樣的值重復...最后一步。然后重復這個程序,直到我得到像“9”這樣的個位數
Input = 123456789
Output number = 9
Make a pair (left to right) => 12 34 56 78 9
Sum the each pair individually => 3 7 11 15 9
Again make a single number => 3711159
Make a pair (left to right) => 37 11 15 9
Sum the each pair individually => 10 2 6 9
Again make a single number => 10269
Make a pair (left to right) => 10 26 9
Sum the each pair individually => 1 8 9
Again make a single number => 189
Make a pair (left to right) => 9 9
Sum the each pair individually => 18
Again make a single number => 18
Make a pair (left to right) => 9
我正在使用此代碼。
a = 123456789
a1 = a.to_s.scan(/..?/)
a2 = a1.map(&:to_i).sum
a3 = a2.to_s.scan(/..?/)
a4 = a3.map(&:to_i).sum
它給了我這個輸出
123456789
["12", "34", "56", "78", "9"]
[12, 34, 56, 78, 9]
189
["18", "9"]
27
誰能幫我?提前致謝
uj5u.com熱心網友回復:
您正在對以下元素求和[12, 34, 56, 78, 9]:
[12, 34, 56, 78, 9].sum #=> 189
這是12 34 56 78 9。
相反,您想對每個元素的數字求和:
[12, 34, 56, 78, 9].map { |i| i.digits.sum }
#=> [3, 7, 11, 15, 9]
哪個是[1 2, 3 4, 5 6, 7 8, 9]
應用于您的代碼:
number = 123456789
number.to_s #=> "123456789"
.scan(/..?/) #=> ["12", "34", "56", "78", "9"]
.map(&:to_i) #=> [12, 34, 56, 78, 9]
.map { |i| i.digits.sum } #=> [3, 7, 11, 15, 9]
.join #=> "3711159"
.to_i #=> 3711159
scan您也可以使用Integer#digitswhich 立即將它們作為整數回傳:(但順序相反)
number = 123456789
number.digits #=> [9, 8, 7, 6, 5, 4, 3, 2, 1]
.reverse #=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
.each_slice(2) #=> [[1, 2], [3, 4], [5, 6], [7, 8], [9]]
.map(&:sum) #=> [3, 7, 11, 15, 9]
.join #=> "3711159"
.to_i #=> 3711159
作為一個回圈:
number = 123456789
while number.digits.size > 1
number = number.digits.reverse.each_slice(2).map(&:sum).join.to_i
end
number #=> 9
uj5u.com熱心網友回復:
您可以按如下方式進行。
n = 123456789
s = n.to_s
#=> "123456789"
loop do
e = s.each_char.each_slice(2)
m = e.first.join.to_i
break m if m <= 9
s = e.map { |e| e.map(&:to_i).sum}.join
end
#=> 9
我們可以添加一些puts陳述句來幫助解釋正在進行的計算。
puts "s = #{s}"
loop do
e = s.each_char.each_slice(2)
puts "\ne = #{e}"
puts "e.to_a = #{e.to_a}"
f = e.first
m = f.join.to_i
puts "f = #{f}, m = #{m}"
puts "Finished! Returning #{m}" if m <= 9
break m if m <= 9
s = e.map { |e| e.map(&:to_i).sum}.join
puts "s = #{s}"
end
#=> 9
s = 123456789
e = #<Enumerator:0x00007ff9333befc8>
e.to_a = [["1", "2"], ["3", "4"], ["5", "6"], ["7", "8"], ["9"]]
f = ["1", "2"], m = 12
s = 3711159
e = #<Enumerator:0x00007ff9333b6580>
e.to_a = [["3", "7"], ["1", "1"], ["1", "5"], ["9"]]
f = ["3", "7"], m = 37
s = 10269
e = #<Enumerator:0x00007ff9333ad390>
e.to_a = [["1", "0"], ["2", "6"], ["9"]]
f = ["1", "0"], m = 10
s = 189
e = #<Enumerator:0x00007ff93339fdf8>
e.to_a = [["1", "8"], ["9"]]
f = ["1", "8"], m = 18
s = 99
e = #<Enumerator:0x00007ff9368c7300>
e.to_a = [["9", "9"]]
f = ["9", "9"], m = 99
s = 18
e = #<Enumerator:0x00007ff9368bd1e8>
e.to_a = [["1", "8"]]
f = ["1", "8"], m = 18
s = 9
e = #<Enumerator:0x00007ff933394458>
e.to_a = [["9"]]
f = ["9"], m = 9
Finished! Returning 9
請注意,對于 enumerator e,e.to_a回傳將由列舉器生成的物件陣列。
請參閱Enumerable#each_slice。一個小點:我使用String#each_char而不是String#chars來生成一個列舉器而不是一個臨時的字母陣列。
也可以寫
loop do
e = s.scan(/..?/)
m = e.first.to_i
break m if m <= 9
s = e.map { |e| e.to_i.digits.sum}.join
end
uj5u.com熱心網友回復:
解決編程問題的兩個最重要的事情是:
- 選擇正確的資料結構和
- 選擇正確的演算法。
在這種特殊情況下,資料結構不是很有趣,但演算法很有趣。眾所周知,一個自然數的小數位數之和等于該數除以 9 時的余數。并且不難證明無論您如何分組、切片、并重新組合數字。
因此,我們可以通過將演算法更改為:
def iterative_sum_of_digits(n)
raise ArgumentError, 'Argument must be nonnegative' if n.negative?
return 0 if n.zero?
(n % 9).nonzero? || 9
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/468347.html
標籤:红宝石
