我试图收集用户的输入,将输入作为整数存储在数组中,然后迭代每隔一个数字,从第二个到最后一个,然后再取这些数字并乘以2.然后,我将产品的各个数字相加,但我将该数学结果存储为整数
这是我的代码:
# Prompt user for input
print "Number: "
array = []
card = gets.to_i
array << card
# Prompt the user until the number is valid
until card.is_a?(Integer) && card.positive? && card.to_s.length > 10
print "Retry: "
card = gets.to_i
array << card
end
array = array.to_s.scan(/\d/).map(&:to_i) # split number in array by digit
i = -2 # starting the loop at second to last digit
t = ((array.length)/2).ceil # number of times to iterate through the array length & roundup
$sum = 0
t.times do #go through the array as many times as digits needed, starting 2nd to last
$sum += ((array[i]) * 2).digits
i -= 2
end
puts $sum
这给了我控制台错误:
Array can't be coerced into Integer (TypeError)
我也尝试将产品的各个数字放入一个像这样的新数组中
final_array = []
t.times do #go through the array as many times as digits needed, starting 2nd to last
final_array << ((array[i]) * 2).digits.to_i
i -= 2
end
但这给了我错误undefined method to_i for [2]:Array
我知道有另一种方法可以使用%来解决这个问题,但我试图用数组来解决这个问题。希望有人可以帮忙!
答案 0 :(得分:0)
更改此行:
final_array << ((array[i]) * 2).digits.to_i
通过这个:
final_array += ((array[i]) * 2).digits
答案 1 :(得分:0)
您可以使用迭代器和数组切片执行此操作。
首先将数组从带有切片(ruby array slice method)的最后一个(-1)元素中取出,然后反转该切片。
a = [1,2,3,4,5]
b = a.reverse[1..-1]
=> [4, 3, 2, 1]
接下来,您只需要新数组的索引元素,您可以通过迭代数组并检查它的索引是否为偶数来找到它。 each_with_index
方法可以帮助您(Ruby enumerable each_with_index method)。如果索引是偶数,则将该索引处的值存储在另一个数组
c = []
b.each_with_index {|n,i| c << n if i.even? }
c
=> [4, 2]
然后使用数组inject
方法进行数学运算(在此详细解释 - SO discussion of Ruby inject)。
c.inject(0) {|sum, n| sum + (n * 2) }
=> 12
这种方法允许你跳过搞乱计数器变量并在数组上向后工作,只是坚持使用Ruby迭代器。