埃数例子: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
EX:输入为123
输入while,我们在数字%10语句后得到12。但是,在那之后,它再也不会进入;这是为什么? 12 % 10
不应该0
。
我添加了puts angstrom
和puts initial_number
行只是为了查看这些数字的进行情况。
答案 0 :(得分:2)
我怀疑你想要更多的东西:
angstrom = 0
while number > 0
digit = number % 10
angstrom += digit ** 3
number /= 10
end
隔离每个数字而不破坏数字,并避免提前终止输入数字内部包含的零。
使用divmod
进一步改善(Cary Swoveland提供):
angstrom = 0
while number > 0
number, digit = number.divmod(10)
angstrom += digit ** 3
end
答案 1 :(得分:1)
这是另一种方式。
def angstromize(number)
number.to_s.each_char.reduce(0) { |t,d| t+(d.to_i)**3 }
end
angstromize(153)
#=> 153
答案 2 :(得分:0)
我在之前的评论中暗示过这一点,但是你正在彻底破坏你的while
条件。你想从数字中得到一个数字,但在这个过程中,这一行扼杀了它:
number = number % 10
这可以保证number
始终小于10,并且会一直强制你的循环提前保释。你也会计算完全错误的东西。
最简单的解决方案是创建一个新变量,表示您提取的数字。
digit = number % 10
angstrom = angstrom + (digit ** 3)
进行此更改可以使153
的测试用例成功通过。