-1

我是学习 Ruby 的新手,我试图要求用户输入,将该数字平方,然后返回平方数字中的数字之和。我对何时使用 .to_s 和 .to_i 感到困惑,我也想在不使用快捷方式的情况下完成此操作。

这是我到目前为止所拥有的(不起作用):

def sqr_digit_sum(n)

  square = (n ** 2).to_s
  no_of_digits = square.size

  sum = 0
  i = 0

  while i < no_of_digits
    sum += square[i].to_i
    i += 1
  end

  puts sum
end

我不明白为什么如果我为 81 的平方输入 9,square[0] 返回 56 而不是 8。有人可以解释一下吗?

4

3 回答 3

2

看来您使用的是 Ruby 1.8,其中String#[]带有 Fixnum 参数(例如'8'[0])返回十进制 ASCII 字符值。哪个'8'56. 由于这已经是一个 Fixnum,调用to_i它没有任何效果。您应该将索引和长度传递给[]

string = '81'
string[0, 1]  #=> "8"
string[1, 1]  #=> "1"

但是,如果您想要数组中的所有字符,则应使用chars/ each_char

string = '81'
string.chars.to_a  #=> ["8", "1"]
string.chars.to_a.map { |char| char.to_i }  #=> [8, 1]

这使得使用上面的和实现你想要的东西相当简单reduce

n = 9
(n ** 2).to_s.chars.to_a.map { |char| char.to_i }.reduce(0, :+)  #=> 9

但最终,您应该尽快升级到 Ruby 2.0(或至少 1.9.2+),因为 1.8 不再受支持且不会收到任何安全更新。

于 2013-09-26T03:21:35.427 回答
0

你可以这样做

def sqr_digit_sum(n)
  square = (n ** 2)
  puts square.to_s.split(//).inject(0) { |sum, number_as_string| number_as_string.to_i + sum }
end
于 2013-09-26T01:47:51.157 回答
-1

你的代码工作得很好。此外,对于以下代码,结果8预期一致:

n = 9 
square = (n ** 2).to_s[0]
puts square

最后,我可以建议将您的代码重构为:

def sqr_digit_sum(n)
  sum = 0
  (n ** 2).to_s.each_char { |c| sum += c.to_i }
  puts sum
end

你真的不需要一个while循环。

于 2013-09-26T01:47:08.353 回答