我在RubyMonk上学习了这门课程并且我坚持这个问题:
9是Kaprekar数,因为:9 ^ 2 = 81和8 + 1 = 9 查找给定数字是否为Kaprekar数字
使用此功能,我不断为每个号码获取false
:
def kaprekar?(k)
k == k * k.to_s.chars.map(&:to_i).inject(:+)
end
使用此功能,我true
(预期)获得9
,false
和55
获得19
(预期),但false
和297
也应703
(true
}。
def kaprekar?(k)
a = k * k
k == a.to_s.chars.map(&:to_i).inject(:+)
end
这是RubyMonk解决方案
def kaprekar?(k)
no_of_digits = k.to_s.size
square = (k ** 2).to_s
second_half = square[-no_of_digits..-1]
first_half = square.size.even? ? square[0..no_of_digits-1] : square[0..no_of_digits-2]
k == first_half.to_i + second_half.to_i
end
答案 0 :(得分:2)
试试这个:
def kaprekar?(k)
sq=k**2
k == [sq.to_s.slice(0..k.to_s.size-1),sq.to_s.slice(k.to_s.size..-1)].map(&:to_i).inject(:+)
end
这将采用数字的平方,对其进行切片,添加两个部分并相应地返回true或false。
对于k = 1,9,45,55,99,297,703,......它返回true而其他值则为false。
答案 1 :(得分:0)
我正在研究同样的问题。这是我的解决方案。我不明白为什么k=297
不会通过?
def kaprekar?(k)
str = (k**2).to_s
n = k.to_s.length
num2 = str.slice!(-n..-1).to_i
num1 = str.slice!(0..str.length-n-1).to_i
num = num1 + num2
if num == k
return true
else
return false
end
end