簡體   English   中英

Ruby程序Kaprekar編號測試

[英]Ruby program Kaprekar number test

我正在嘗試編寫一些代碼,以測試數字是否為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是True”,否則放置“ 22是False”

該代碼不會返回任何錯誤,但是只要k的平方是偶數個數字,則無論提供的數字是否為Kaprekar數字,該方法都將返回值True。 實際上,即使我將測試部分更改為:

if x1 + x2 = k
  return false
else
  return false
end

...我仍然得到True歸還給我! 那怎么可能?

任何幫助,將不勝感激!

編輯1:我將真值分配固定為“ ==”而不是“ =“,並且我將“ ^”指數更改為“ **”。 但是,在上述兩種情況下,我仍然會收到“ True”消息。 :(

編輯2:似乎我錯過了2個“ ^”! 修復!

編輯3:每次運行代碼時,添加一些代碼來測試Kaprekar方法。 修復了在線錯誤(似乎我正在嘗試拆分字符串的長度,而不是字符串本身。天哪!)。 無論如何,現在我都會收到錯誤消息:“ kaprekarTest.rb:37:main:Object的未定義方法'kaprekar'(NoMethodError)”現在,我剛剛定義了kaprekar方法。 為什么我會收到錯誤消息,說沒有這種方法?

找到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

^在Ruby中不是戰俘。 **是。

> 3^2
=> 1
> 3**2
=> 9
if x1 + x2 = k

那是一個賦值語句,而不是條件語句,因此它將永遠是“真實的”。

正如Philip所說,“指數運算符”是**而不是^

更新:您正在調用(如前所述) if kaprekar(500500)因為您定義了keprekar? if kaprekar(500500)而調用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

卡佩雷卡

def convert_array(number)
  arr = []
  div = 10**(number.to_s.length - 1)

  while div >= 10 do
    arr << (number/div)
    number = (number%div)
    div = (div / 10)
  end

  arr << number
  arr
end

def kaprekar?(number)
  c = convert_array(number**2)
  i = 0
  flag = false

  while i < c.length do
    if number == (c.first(i).join().to_i + c.last(c.length - i).join().to_i)
      flag = true
      break
    end

    i = i+1
  end

  flag
end

嘗試這個。

如果您想使其更簡潔:

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)

在我的機器上。

編輯:發布解決方案的較短版本

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM