Ruby程序Kaprekar数字测试

时间:2013-10-14 23:18:17

标签: ruby math sequences

我正在尝试制作一些代码来测试一个数字是否是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方法。为什么我会得到一个错误,说没有这样的方法?

5 个答案:

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

^不是R​​uby的粉丝。 **是。

> 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)

在我的机器上。

编辑:发布更短版本的解决方案