2015-02-10 74 views
1

我正在解決Kaprekar號碼https://rubymonk.com/learning/books/1-ruby-primer/problems/150-kaprekar-s-number的問題。代碼,我在這裏,前面已經討論過了,但我對另一個方面感興趣。練習要求:查找Kaprekar的號碼

查找給定的數字是否是Kaprekar數字。

有一個解決方案(見解決方案)下面的練習,看起來像這樣:

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 

,是一個提示(需要提示嗎?)演習也低於:

使用Fixnum.to_s將該數字轉換爲一個字符串來執行數字 操作。使用String.to_i轉換回整數。

我有幾個問題,誰能給我解釋一下:

1)爲什麼它需要將數字轉換成字符串做位操作? 2)在second_half變量中,我明白 - (減號)符號是方格的背面,但它是什麼意思:-1?它必須是左側(first_half)n或n-1個數字而不是second_half。或者它是否以引號結束,因爲我們將數字轉換爲字符串?

3)爲什麼在first_half變量中有2個問號 - 在'even'之後和'square'之前?

回答

3

1)爲什麼需要將數字轉換成字符串做數字操作?

因爲你必須讓下半年:

second_half = square[-no_of_digits..-1] 

這是更方便地在這裏處理字符串。這將返回最後的no_of_digits,例如

'1234'[-2..-1] # => '34' 

-2..-1是一個數字range,它是不可能直接獲得一定範圍內的整數位置。

在second_half變量我明白, - (減號)符號是廣場的背面,但它是什麼意思:-1?它必須是左側(first_half)n或n-1個數字而不是second_half。或者它是否以引號結束,因爲我們將數字轉換爲字符串?

-1是最後一個元素。即

'1234'[-1] # => 4 

同樣,-n是從最後一個元件,其中n是某個整數

3)爲什麼在first_half可變2問號第n - 後「偶數」和前「方「?

第一個問號是方法名稱的一部分。返回布爾值的方法應該按照慣例以問號結束。請注意,kaprekar?也不例外。

第二個是三元條件運算符的一部分。它看起來如下:

boolean_expression ? true_expression : false_expression 

first_half要麼square[0..no_of_digits-1]如果square的字符數爲偶數或square[0..no_of_digits-2]否則

+2

有關問題#1的OP註釋:儘管你可能會寫一些你計算機程序源代碼是一系列十進制數字,如'2345',計算機通常會將其轉換爲某種二進制格式(如[二進制補碼](http://en.wikipedia.org/wiki/Two%27s_complement )),因爲這些格式對於計算機來說更容易處理。所以如果你想使用數字的十進制數字,你需要將它轉換回知道數字的形式。一種合理的方法是將其轉換爲字符串。 – 2015-02-10 17:16:03