[英]Ruby program Kaprekar number test
我正在嘗試編寫一些代碼,以測試數字是否為Kaprekar數字。 我環顧四周,看看是否有人提出過這個建議,但是我沒有找到足夠的信息,所以我給您帶來了麻煩。
什么是Kaprekar號碼:
對於具有n位數字的Kaprekar數字k,如果將其平方,然后將右邊的n位數字添加到左邊的n位或n-1位數字,則總和為k。 圖9是一個例子,因為9 ^ 2 = 81,而8 + 1 = 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
如果kaprekar(22)放置“ 22是True”,否則放置“ 22是False”
該代碼不會返回任何錯誤,但是只要k的平方是偶數個數字,則無論提供的數字是否為Kaprekar數字,該方法都將返回值True。 實際上,即使我將測試部分更改為:
if x1 + x2 = k
return false
else
return false
end
...我仍然得到True歸還給我! 那怎么可能?
任何幫助,將不勝感激!
編輯1:我將真值分配固定為“ ==”而不是“ =“,並且我將“ ^”指數更改為“ **”。 但是,在上述兩種情況下,我仍然會收到“ True”消息。 :(
編輯2:似乎我錯過了2個“ ^”! 修復!
編輯3:每次運行代碼時,添加一些代碼來測試Kaprekar方法。 修復了在線錯誤(似乎我正在嘗試拆分字符串的長度,而不是字符串本身。天哪!)。 無論如何,現在我都會收到錯誤消息:“ kaprekarTest.rb:37:main:Object的未定義方法'kaprekar'(NoMethodError)”現在,我剛剛定義了kaprekar方法。 為什么我會收到錯誤消息,說沒有這種方法?
找到kaprekar編號的最佳和簡單的解決方案:
def kaprekar?(k)
ks = k**2
lenf = (ks.to_s.length)-1
lenh = (ks.to_s.length / 2) - 1
a = ks.to_s[0..lenh].to_i
b = ks.to_s[lenh+1..lenf].to_i
k == (a+b)
end
^在Ruby中不是戰俘。 **是。
> 3^2
=> 1
> 3**2
=> 9
if x1 + x2 = k
那是一個賦值語句,而不是條件語句,因此它將永遠是“真實的”。
正如Philip所說,“指數運算符”是**
而不是^
。
更新:您正在調用(如前所述) if kaprekar(500500)
因為您定義了keprekar?
if kaprekar(500500)
而調用if kaprekar(500500)
時不存在的方法keprekar?
方法。
在您的方法中,您可能需要將k**2
括在括號中,以便.to_s
調用不僅作用於數字2。
在完成這些修復后,希望您將修復其余的所有錯誤,因此至少我們可以直截了當地說“首先找出其他代碼的問題所在”。
此代碼將為您提供答案。 尚未驗證這些數字的實際正確性,但至少沒有得到語法或運行時錯誤。
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
卡佩雷卡
def convert_array(number)
arr = []
div = 10**(number.to_s.length - 1)
while div >= 10 do
arr << (number/div)
number = (number%div)
div = (div / 10)
end
arr << number
arr
end
def kaprekar?(number)
c = convert_array(number**2)
i = 0
flag = false
while i < c.length do
if number == (c.first(i).join().to_i + c.last(c.length - i).join().to_i)
flag = true
break
end
i = i+1
end
flag
end
嘗試這個。
如果您想使其更簡潔:
def kaprekar?(k)
k_squared = (k*k).to_s
idx = k_squared.length / 2
return k_squared[0..idx-1].to_i + k_squared[idx..-1].to_i == k
end
附帶說明:我很想看看是否有人想出一個更快的 ruby實現方案?
require 'benchmark'
puts Benchmark.measure{ (1..10000000).select{|k| kaprekar?(k)} }
產量
ruby kaprekar.rb
11.240000 0.010000 11.250000 ( 11.249131)
在我的機器上。
編輯:發布解決方案的較短版本
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.