我正在做一个 Ruby 练习,但没有得到我想要的输出。
我认为问题从我的算法的第 2 步开始。while 循环的计数器让我有点困惑,我不确定如何结束 while 循环。但除此之外,我认为代码基本没问题。
Write a program, which will find all such numbers between 1000 and 3000 (both included) such that each digit of the number is an even number.
The numbers obtained should be printed in a comma-separated sequence on a single line.
我要实现:
- 迭代整个范围 (
1000..3000
) 并识别所有偶数,并将它们存储到名为array_evens
的单独数组中。 - 遍历
array_evens
并将每个偶数分成单独的数字。 - 遍历所有这些数字并使用
even?
确定每个数字是偶数还是假数。 - 如果该数字是偶数,将其推送到名为
all_evens_baby
的数组中
这是我的代码:
range = (1000..3000)
array_even = Array.new()
even_digits_number = []
n = 0 #counter variable
all_evens_baby = []
even_or_odd = nil
range.select do |x|
if x.even?
array_even = array_even.push(x)
while (n <= array_even.length)
#The placement of this while loop may be wrong.
#iterate over all evens to divide all numbers into singular digits
current_divided_number = array_even[n].to_s.chars
current_divided_number.map do |x|
#iterate over all digits to determine if even or odd
even_or_odd = x.to_i.even? #=> true or false
if even_or_odd == true
all_evens_baby = even_digits_number.push(array_even[n])
else
end
end
n+=1
end
end
end
最佳答案
首先尝试让当前代码正常工作 - 它离我们不远了:
range = (1000..3000)
array_even = Array.new()
all_evens_baby = []
range.each do |x|
if x.even?
array_even.push(x)
end
end # you'r done here, step 1 is finished.
# shorter is: array_even = range.select(&:even?)
array_even.select do |x|
current_divided_number = x.to_s.chars
n = 0 #counter variable
current_divided_number.each do |d|
n=n+1 if d.to_i.even?
end
all_evens_baby << x if n == 4
end
puts all_evens_baby.join(",")
第一步是不必要的,第 2/3 步无论如何都会过滤掉可能性。
Ruby 2.4 有一个很好的方法来获取整数的数字,称为 digits
,因此可以避免转换为字符串。
看看:
all_evens_baby = (1000..3000).select do |num|
num.digits.all? do |d|
d.even?
end #if this is true, num will be in all_evens_baby
end
puts all_evens_baby.join(",")
关于ruby - 小脚本在 Ruby 中的循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41984381/