#ruby #math
#ruby #математика
Вопрос:
Я работаю над заданием, которое выглядит следующим образом:
У банка есть неограниченный запас банкнот достоинством в 3 песо и 5 песо. Покажите, что этими двумя типами банкнот банк может выплатить любое количество песо, превышающее 7.
Ответ таков:
Банк может заплатить 8 песо, оплатив одну банкноту достоинством в 3 песо и одну банкноту достоинством в 5 песо.
Банк может заплатить 9 песо, оплатив три банкноты достоинством в 3 песо.
Банк может заплатить 10 песо, оплатив две банкноты достоинством в 5 песо.
Банк может выплатить 11 или более песо, выплачивая банкноты достоинством в 3 песо до тех пор, пока для выплаты не останется всего 8, 9 или 10 песо, а затем используя одну из вышеуказанных стратегий. (Если вычесть тройки из числа 11 или больше, то в конечном итоге получится одно из 8, 9 или 10.)
И я пытаюсь реализовать эту функциональность в Ruby
программе.
До сих пор я делал следующее:
class Money
def initialize(price)
@price = price.to_i
validate(@price)
end
def validate(price)
if price >= 8
calculate(price)
elsif price < 8
puts "Minimum ammount is 8 pesos"
end
end
def calculate(price)
if price%5 === 0
fives = price/5
threes = 0
end
result(fives, threes)
end
def result(fives, threes)
puts "#{fives} five peso notes, #{threes} three peso notes."
end
end
m = Money.new(ARGV.first)
Не могли бы вы, пожалуйста, помочь мне вставить эту математическую задачу в программу? Спасибо.
Комментарии:
1. В основном у вас все получилось, хотя я готов поспорить, что тройное равенство === должно было быть двойным ==
2. Подумайте о
r = price % 3
. Для остатка возможны три значенияr
: 0, 1 или 2. Ноль означает, что вы уже знаете решение. Вам просто нужно придумать способ написания кода, который обрабатывает 1 и 2.
Ответ №1:
def count(price)
t = 0
if price >= 11
t = (price - 8) / 3
price -= t * 3
end
if price == 8
[t 1, 1]
elsif price == 9
[t 3, 0]
elsif price == 10
[t, 2]
else
fail "price too small"
end
end
threes, fives = count(42)
puts "#{fives} five peso notes, #{threes} three peso notes."