如何使用Ruby计算正方形的位数之和?
我刚开始学习Ruby,我试图让用户输入一个数字,将该数字平方,然后返回平方数中的数字之和。我不知道什么时候使用.to_s和.to_I,我也想不使用快捷方式来完成这项任务 以下是我到目前为止所做的(不起作用):如何使用Ruby计算正方形的位数之和?,ruby,Ruby,我刚开始学习Ruby,我试图让用户输入一个数字,将该数字平方,然后返回平方数中的数字之和。我不知道什么时候使用.to_s和.to_I,我也想不使用快捷方式来完成这项任务 以下是我到目前为止所做的(不起作用): def sqr数字和(n) 平方=(n**2)。至 数字的数量=平方。大小 总和=0 i=0 而我
def sqr数字和(n)
平方=(n**2)。至
数字的数量=平方。大小
总和=0
i=0
而我<没有数字
求和+=平方[i]。到_i
i+=1
结束
求和
结束
我不明白为什么如果我为81的平方输入9,平方[0]返回56而不是8。有人能解释一下吗?你的代码。此外,对于以下代码,is8
与预期一致:
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