数値がカプレカー数であるかどうかをテストするコードを少し作成しようとしています。誰かがすでにこの問題を提起していないか調べてみましたが、十分な情報が見つからなかったので、私の悩みをあなたに伝えます。
カプレカー数とは:
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 メソッドが定義されました。そのような方法がないというエラーが表示されるのはなぜですか?