在Ruby中计算Angstrom数的问题

时间:2016-10-17 22:19:39

标签: ruby if-statement while-loop numbers

埃数例子: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 angstromputs initial_number行只是为了查看这些数字的进行情况。

3 个答案:

答案 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的测试用例成功通过。