2016-05-27 20 views
-2

這是得到給定兩個數字的乘積的模10(%10)的問題。由於數字太大,因此會以字符串形式給出。瞭解Java按位恭維(〜)的用法

的解決方案將是,

int modulo10(String a, String b) { 
    return (a.charAt(a.length()-1)-48)*(b.charAt(b.length()-1)-48)%10; 
} 

而且我發現下面的解決方案由別人。

int modulo10(String a, String b) { 
    return ~-~a.charAt(a.length()-1)*~-~b.charAt(b.length()-1)%10; 
} 

有人可以幫助我瞭解它將如何提供所需的正確輸出。

+0

爲什麼降票呢?他們可以給出一個理由,以便我們可以修改錯誤並糾正錯誤。 – prime

+1

沒有倒下,但:「你能幫我理解」是一個模糊的問題。它沒有解釋你不瞭解的內容,也沒有解釋你做了什麼(這是相關的,因爲不需要花時間在答案中解釋這些事情)。 –

回答

4

要是你把它放下,你問就是爲什麼這個工程:

int modulo10(char ca, char cb) { 
    return (~-~ca * ~-~cb) % 10; 
} 

假設它被稱爲與每個字符串的最後一個字符。

考慮一下'0'~-~c映射到:

  • '0' == 48
  • ~c => ~48 == -49
  • -~c => -(-49) == 49
  • ~-~c => ~49 == -50

同樣,對於'1'

  • '1' == 49
  • ~c => ~49 == -50
  • -~c => -(-50) == 50
  • ~-~c => ~50 == -51

等,所以0-9被映射到整數-50, -51, ... -59

那麼接下來的字符,你只是乘以兩個將數字映射在一起 - 都是負數,所以結果是肯定的;以10爲模給出「正確」的答案。

這看起來像一個「聰明的**」技巧,這對任何人來說都是完全不清楚的。

您的方法 - 除了事實可以使用'0'而不是文字48 - 更容易理解,並且可能更有效。

+0

感謝您的明確解釋。以及這個解決方案必須儘可能小。 (減少使用的字符數)。這就是爲什麼使用'48'而不是零的char表示。但是,謝謝你指出這一點。 :) – prime