-1

私はRubyを学ぶのが初めてで、ユーザーに入力を求め、その数を2乗してから、2乗した数の桁の合計を返そうとしています。いつ .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 の 2 乗に 9 を入力すると、square[0] が 8 ではなく 56 を返す理由がわかりません。

4

3 に答える 3

2

Ruby 1.8 を使用しているようですString#[]。Fixnum 引数 (例: '8'[0]) を使用すると、10 進数の 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

ただし、最終的には、1.8 はサポートされなくなり、セキュリティ アップデートも受けられないため、できるだけ早く Ruby 2.0 (または少なくとも 1.9.2+) にアップグレードする必要があります。

于 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 に答える