2016-01-14 2 views
1

Я пытаюсь найти сумму всех чисел, кратных 3 или 5 ниже 10Найти кратные 3 или 5 ниже 10

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
result = 0 
numbers.each do |number| 
    if number % 3 == 0 or number % 5 == 0 
    result += number 
    end 
    print result 
end 

Я получаю это: 0033814141423, но я ожидаю, 23, так как это сумма 3, 5, 6, 9.

+0

В чем Ваш вопрос? – sawa

ответ

4

Ваш оператор print находится внутри цикла. Его следует перемещать на улицу.

numbers = [1,2,3,4,5,6,7,8,9] 
result = 0 
numbers.each do |number| 
    if number % 3 == 0 or number % 5 == 0 
    result += number 
    end 
end 
print result 

Правильный отступ также поможет вам поймать эти ошибки. Кроме того, вы должны использовать p для распечатки информации, а не print.

С p каждый выход был бы выполнен на новой линии. Вероятно, это будет намек, чтобы понять эту проблему.

Это также возможная альтернатива с использованием Enumerable#inject с аккумулятором.

numbers = [1,2,3,4,5,6,7,8,9] 
numbers.inject(0) do |acc, number| 
    acc + case 
    when number % 3 == 0 then number 
    when number % 5 == 0 then number 
    else 0 
    end 
end 

И более компактной форме

numbers = [1,2,3,4,5,6,7,8,9] 
numbers.lazy.select { |n| n % 3 == 0 || n % 5 == 0 }.inject(:+) 
+0

Или 'puts', который является' print' с новой строкой. 'p x' похоже на' puts x.inspect'. –

+0

Ahh, я вижу, то, что меня смутило, было то, что я не знал, должны ли заявления заканчиваться, хотя это довольно очевидно. Спасибо! –

2

Вы можете использовать Array#select метод.

result = 0 
[1,2,3,4,5,6,7,8,9].select{|i| i % 3 == 0 || i % 5 == 0}.each do |num| 
    result += num 
end 

или более короткое время с inject.

[1,2,3,4,5,6,7,8,9].select{|i| i % 3 == 0 || i % 5 == 0}.inject(:+)