2016-08-30 31 views

回答

3

在這種情況下(j+k)/2相同(j/2) + (k/2)

糾錯按照bilalba

int j = Integer.MAX_VALUE; 
    int k = Integer.MAX_VALUE; 

    int res = (j/2) + (k/2) + (j%2 & k%2); 
    System.out.println(res); 
+1

這實際上會給出錯誤的答案。它會給Integer.MAX_VALUE-1。 – bilalba

+0

你是對的@bilalba。該解決方案適用於大多數情況,但不適用於這種情況。 – Kekis2014

+1

更新:更新的解決方案現在可以運行 – Kekis2014

0
(j/2) + (k/2) + ((j%2) && (k%2)) 

((j%2)& &(K%2))是迎合爲奇數的情況。如果J,K = 1,則j/2 + K/2只會給你0

這是因爲0.5將地板到0

+0

感謝您的更正,但您的代碼無法編譯。請參閱我的回答 –

+0

您究竟會如何編碼@bilalba。我想我明白你想說什麼,但我不太清楚'+(j%2 && k%2)'是什麼意思,因爲@Scary Wombat說,代碼不會編譯 – Kekis2014

+2

@ Kekis2014我已經對我的答案進行了修正,正確的代碼應該是'(j/2)+(k/2)+(j%2 & k%2);'這只是一個'&' –

1

你可以寫入下一個最小整數,(j/2) + (k/2) 。以下是使用典型方法的兩個小數字1011的示例。

10 + 11 = 21 
21/2 = 10.5 

現在的其他方式:

10/2 = 5; 
11/2 = 5.5; 
5.5+5 = 10.5; 

正如你可以在這裏看到,無論哪種方式,你會得到相同的結果,但你不會有增加的數字,因爲這會導致溢出如你所說。

編輯

我才意識到這是錯誤的,只會偶數號的工作。這是最佳解決方案(適用於所有數字)。

(j/2) + (k/2) + (j%2 && k%2); 
1

j + (i - j)/2相當於(i + j)/2和將在這種情況下不會溢出(當數之間差小)。在這種表達式溢出的情況下,(i + j)/2不會。