0

数値がカプレカー数であるかどうかをテストするコードを少し作成しようとしています。誰かがすでにこの問題を提起していないか調べてみましたが、十分な情報が見つからなかったので、私の悩みをあなたに伝えます。

カプレカー数とは:

n 桁のカプレカー数 k の場合、それを 2 乗し、右 n 桁を左 n または n-1 桁に追加すると、結果の合計は k になります。9^2=81、8+1=9 であるため、9 はこの例です。

これが私が今まとめたものです:

def kaprekar?(k)

  if k**2.to_s.length % 2 == 0
    split_k_array = k**2.to_s.split(//)
    half_k_array_length = split_k_array.length / 2
    i = half_k_array_length
    x1 = 0

    while i > 0
      x1 = x1 + (10**i * split_k_array[i-1])
      i = i - 1
    end

    x2 = 0
    i = split_k_array.length

    while i > half_k_array_length
      x2 = x2 + (10**(i-half_k_array_length))
      i = i - 1
    end

    if k == x1 + x2
      return true
    else
      return false
    end

  else

    puts "Let's figure out what wrong with the other code first :("
    return "Meh"

  end

end

if kaprekar(500500)
  puts "500500 is True :)"
else
  puts "500500 is False :("
end

if kaprekar(9)
  puts "9 is True :)"
else
  puts "9 is False :("
end

if kaprekar(22) puts "22 is True" そうでなければ puts "22 is False" end

このコードはエラーを返しませんが、k の 2 乗が偶数桁である限り、指定された数値がカプレカー数であるかどうかにかかわらず、メソッドは値 True を返します。実際、テスト部分を次のように変更しても、

if x1 + x2 = k
  return false
else
  return false
end

...私はまだ True を返してくれます! そんなことがあるものか?

どんな助けでも大歓迎です!

編集 1:「=」の代わりに「==」を読み取るように真理値の代入を修正し、「^」指数を「**」に変更しました。ただし、上記の両方の状況で「True」が返されます。:(

編集 2: 2 つの "^" を逃したようです! 修正しました!

編集 3: コードが実行されるたびに Kaprekar メソッドをテストするコードを追加しました。行上のエラーを修正しました (文字列自体ではなく、文字列の長さを分割しようとしていたようです。おやおや!)。いずれにしても、「kaprekarTest.rb:37: undefined method `kaprekar' for main:Object (NoMethodError)」というエラー メッセージが表示されます。これで、kaprekar メソッドが定義されました。そのような方法がないというエラーが表示されるのはなぜですか?

4

5 に答える 5

2

^ Ruby では pow ではありません。** は。

> 3^2
=> 1
> 3**2
=> 9
于 2013-10-14T23:28:29.977 に答える
1
if x1 + x2 = k

これは条件ステートメントではなく代入ステートメントであるため、常に「真実」になります。

Philip が述べているように、「指数演算子」は**ではなく^.

更新:if kaprekar(500500)メソッドを定義したため、呼び出すときに存在しないメソッドを (前述のように) 呼び出していますkeprekar?

あなたのメソッドでは、呼び出しが数値 2 だけに作用しないようk**2に、おそらく括弧で囲む必要があります。.to_s

これらの修正の後、発生している残りのエラーを修正していただければ幸いです。そうすれば、少なくとも「最初に他のコードの何が問題なのかを突き止める」ことができるという点に到達できます。

このコードで答えが得られます。これらの数値の実際の正確性は検証されていませんが、少なくとも構文エラーや実行時エラーは発生していません。

def kaprekar(k)

  if k**2.to_s.length % 2 == 0
    split_k_array = (k**2).to_s.split(//)
    half_k_array_length = split_k_array.length / 2
    i = half_k_array_length
    x1 = 0

    while i > 0
      x1 = x1 + ((10**i) * split_k_array[i-1].to_f)
      i = i - 1
    end

    x2 = 0
    i = split_k_array.length

    while i > half_k_array_length
      x2 = x2 + (10**(i-half_k_array_length))
      i = i - 1
    end

    if k == x1 + x2
      return true
    else
      return false
    end

  else

  end

end

if kaprekar(500500)
  puts "500500 is True :)"
else
  puts "500500 is False :("
end

if kaprekar(9)
  puts "9 is True :)"
else
  puts "9 is False :("
end
于 2013-10-14T23:42:57.240 に答える