Проблема расчета чисел Ангстрема в Ruby
Пример числа Ангстрема: 153; 1**3 + 5**3 + 3**3 = 153
puts "Enter a number: "
number = gets.chomp.to_i
initial_number = number
angstrom = 0
while (number % 10) != 0
number = number % 10
angstrom = angstrom + (number ** 3)
number = number / 10
end
puts angstrom
puts initial_number
if angstrom == initial_number
puts "YES ANGSTROM"
else
puts "NO ANGSTROM"
end
Пример: ввод 123
Введя время, мы получим 12 после числа% 10. Но, после этого, это не входит в то время снова; это почему? 12 % 10
не должен выходить 0
,
Я добавил puts angstrom
а также puts initial_number
линии, чтобы проверить, что происходит с числами.
3 ответа
Я подозреваю, что вы хотите что-то более похожее на:
angstrom = 0
while number > 0
digit = number % 10
angstrom += digit ** 3
number /= 10
end
изолировать каждую цифру, не разрушая номер, и избежать досрочного завершения из нулей, содержащихся внутри входного номера.
ДОПОЛНЕНИЕ
Это еще более улучшено (любезно предоставлено Cary Swoveland) с помощью divmod
:
angstrom = 0
while number > 0
number, digit = number.divmod(10)
angstrom += digit ** 3
end
Вот другой способ.
def angstromize(number)
number.to_s.each_char.reduce(0) { |t,d| t+(d.to_i)**3 }
end
angstromize(153)
#=> 153
Я намекал на это ранее в комментариях, но вы калечите свой while
состояние. Вы хотите получить цифру из числа, но в процессе эта строка выводит ее из строя:
number = number % 10
Это гарантирует, что number
всегда будет меньше 10 и всегда заставит ваш цикл освободиться рано. Вы также будете рассчитывать совершенно не то, что нужно.
Самое простое решение - создать новую переменную, которая будет представлять извлеченную цифру.
digit = number % 10
angstrom = angstrom + (digit ** 3)
Внесение этих изменений позволяет ваш тестовый случай 153
пройти успешно.