Проблема расчета чисел Ангстрема в 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 пройти успешно.

Другие вопросы по тегам