Ruby 鲁比蒙:卡普雷卡的号码

Ruby 鲁比蒙:卡普雷卡的号码,ruby,Ruby,我在RubyMonk学习这门课程,我被困在这个问题上: 9是Kaprekar数,因为:9^2=81和8+1=9。 查找给定的数字是否为Kaprekar数 使用此选项,每个数字都会出现错误: def kaprekar?(k) k == k * k.to_s.chars.map(&:to_i).inject(:+) end 使用这个,我得到了9个期望值的真值,55和19个期望值的假值,还有297和703的假值应该是真的 这是RubyMonk解决方案 def kaprekar?(k)

我在RubyMonk学习这门课程,我被困在这个问题上:

9是Kaprekar数,因为:9^2=81和8+1=9。 查找给定的数字是否为Kaprekar数

使用此选项,每个数字都会出现错误:

def kaprekar?(k)
   k == k * k.to_s.chars.map(&:to_i).inject(:+)
end
使用这个,我得到了9个期望值的真值,55和19个期望值的假值,还有297和703的假值应该是真的

这是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
试试这个:

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,99297703,。。。它返回true,而其他值为false。

我正在处理相同的问题。这是我的解决方案。我不明白为什么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

在您的代码实际运行之前,您可能不应该比较代码复杂性。。。你的问题是什么?你的实现不是基于@jonrsharpe的定义,我只是想弄清楚我做错了什么。@MatthiasTotschnig这个定义说数字的平方必须分成两部分,这样它们的和等于原始数字-你在哪里把平方分成两部分?请阅读定义-@MatthiasTotschnig如果你愿意,你可以删除这个问题,或者让其他人来回答。我也不知道,但是你可以用return num==kA替换代码中的if/else语句。几天后回想起来,我的代码太枯燥了。谢谢,@MatthiasTotschnig
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