如何使用Ruby计算正方形的位数之和?

如何使用Ruby计算正方形的位数之和?,ruby,Ruby,我刚开始学习Ruby,我试图让用户输入一个数字,将该数字平方,然后返回平方数中的数字之和。我不知道什么时候使用.to_s和.to_I,我也想不使用快捷方式来完成这项任务 以下是我到目前为止所做的(不起作用): def sqr数字和(n) 平方=(n**2)。至 数字的数量=平方。大小 总和=0 i=0 而我

我刚开始学习Ruby,我试图让用户输入一个数字,将该数字平方,然后返回平方数中的数字之和。我不知道什么时候使用.to_s和.to_I,我也想不使用快捷方式来完成这项任务

以下是我到目前为止所做的(不起作用):

def sqr数字和(n)
平方=(n**2)。至
数字的数量=平方。大小
总和=0
i=0
而我<没有数字
求和+=平方[i]。到_i
i+=1
结束
求和
结束
我不明白为什么如果我为81的平方输入9,平方[0]返回56而不是8。有人能解释一下吗?

你的代码。此外,对于以下代码,is
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
在那里循环时,您实际上不需要

您可以这样做

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

看起来您使用的是Ruby 1.8,其中带有Fixnum参数(例如
'8'[0]
)返回十进制ASCII字符值。对于
'8'
来说,哪个是
56
。由于这已经是一个Fixnum,因此对其调用
将无效。您应该将索引和长度传递给
[]

string = '81'
string[0, 1]  #=> "8"
string[1, 1]  #=> "1"
但是,如果希望数组中的所有字符,则应使用/:

这使得使用上述方法实现所需变得相当简单:


不过,归根结底,您应该尽快升级到Ruby 2.0(或至少1.9.2+)因为1.8不再受支持,也没有收到任何安全更新。

您称之为什么快捷方式?我在
irb
中运行了该代码,并且运行良好。我手动查看了
square[0]
,值是
8
。您使用的是什么版本的Ruby?1.8?为什么会有这么多反对票?这是个好问题,接得好。没有多少人知道这个bug。=)。。。或者它是一个特征?@mohawkjohn是一个特征,但后来(正确地)重新思考。也许更鲜为人知的是Ruby的字符文本(
?x
),它的计算结果与Ruby版本的返回值相同
'x'[0]
。非常感谢!我几天前才开始学习Ruby,所以我为我的幼稚道歉。我不知道你为什么会被否决,除了显然所有的否决选民都不知道这个功能=/@莫霍克约翰,但在1.9。从来没有人说过要与Ruby的古老版本兼容。@Jeffery没有明确说明,但只有一个有效的理由
'81'[0]
会返回
56
:正在使用Ruby 1.8(或更早版本)。@AndrewMarshall,除非另有说明,否则我总是假设使用了最新的稳定版本的语言。在上面的问题中没有这样的规范。因此,对于OP来说,这可能不是一个有效的答案,但对于未来的访问者来说,这肯定是一个有效的答案。如果其他人正在寻找这个确切的问题,这可能是因为他们是无意中使用1.8的新手。来吧,初学者!他们不知道他们用的是什么版本。
string = '81'
string[0, 1]  #=> "8"
string[1, 1]  #=> "1"
string = '81'
string.chars.to_a  #=> ["8", "1"]
string.chars.to_a.map { |char| char.to_i }  #=> [8, 1]
n = 9
(n ** 2).to_s.chars.to_a.map { |char| char.to_i }.reduce(0, :+)  #=> 9