我正在尝试制作一些代码来测试一个数字是否是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是真的” 其他 把“22是假的” 端
此代码不返回任何错误,但只要k的平方为偶数位长,无论提供的数字是否为Kaprekar数,该方法都返回值True。事实上,即使我将测试部分更改为:
if x1 + x2 = k
return false
else
return false
end
......我仍然得到真实的回报给我!怎么可能?
任何帮助将不胜感激!
编辑1:我将真值分配修改为“==”而不是“=”,并将“^”指数更改为“**”。但是,在我上面描述的两种情况下,我仍然得到“真实”的回报。 :(
编辑2:似乎我错过了2“^”s!修好了!
编辑3:每次运行代码时都添加了一些代码来测试Kaprekar方法。修正了线上的错误(似乎我试图分割字符串的长度,而不是字符串本身。天哪!)。在任何情况下,现在我收到错误消息:“kaprekarTest.rb:37:未定义的方法`kaprekar'for main:Object(NoMethodError)”现在,我刚刚定义了kaprekar方法。为什么我会得到一个错误,说没有这样的方法?
答案 0 :(得分:3)
找到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
答案 1 :(得分:1)
^不是Ruby的粉丝。 **是。
> 3^2
=> 1
> 3**2
=> 9
答案 2 :(得分:1)
if x1 + x2 = k
这是一个赋值语句,而不是条件语句,因此它总是'truthy'。
正如菲利普所说,“指数运算符”是**
而不是^
。
更新:您正在调用(如前所述)当您调用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
答案 3 :(得分:0)
KAPREKAR
HWND
试试这个。
答案 4 :(得分:-1)
如果你想让它更简洁:
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)
在我的机器上。
编辑:发布更短版本的解决方案