RubyMonk:Kaprekar的电话号码

时间:2015-12-28 10:23:00

标签: ruby

我在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(预期)获得9false55获得19(预期),但false297也应703true}。

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

2 个答案:

答案 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