2012-04-12 89 views
4

我需要對此代碼進行一些解釋。 這是其他人給出的示例代碼。`check/= 2;'的說明`

for (int i = 1; i <= 8; i++) 
    { 
     if(check % 2 == 0) 
      sum += i; 
     else 
      sum -= i; 
     check /= 2;   <--- Need explanation for this line. 
    } 

但在Pseudo code,沒有check /= 2;程序。

這是完整的Pseudo code

int binary = 0; 
int sum; 

while(binary<256) 
sum = 0; 
for(go through all 8 digits) 
    if the i-th digit is 0 
     sum += i 
    if the i-th digit is 1 
     sum -= i 
end for 

if sum == 0 
    output 

binary++ 
end while 

那麼,這行代碼的目的是什麼?

由於sumbinarycheck初始化爲0

我已經使用上面給出的僞代碼編寫了此代碼。 但似乎我的代碼將複製輸出和一個更多的問題,格式。

我想要的輸出是這樣的格式:

Enter a number : 3 

-1 -2 +3 = 0 
1 +2 -3 = 0 

但我目前輸出:

Enter a number : 3 

-1 -2 3 = 0 
1 2 -3 = 0 

這裏是我的代碼:

CODE IS REMOVED! 

解決了!

我太專注於輸出部分的for -loop,因此錯過了二進制的while -loop,因爲僞代碼用於256個可能的解決方案,因此前端部分將有相同的輸出,例如:

1 - 2 - 3 + 4 = 0        

1 - 2 - 3 + 4 + 5 - 6 - 7 + 8 = 0 

因此,僞代碼可能會給出相同的輸出。所以,因爲該解決方案是在2^n其中n = 1, 2, 3, ...形式,所以更改

while(binary < 256) --->  while (binary < Math.pow(2, input)) 

應該解決這個問題。

解決了答案的格式和副本。

+0

誰是「他人」?代碼應該做什麼? – 2012-04-12 07:42:18

+0

我在'yahoo.answer.com'中被問到了,其中一個答覆給了我這個示例代碼,那個「其他人」。 該代碼是爲狀態空間查找所有可能的解決方案。 – Chin 2012-04-12 07:59:20

回答

5

這是到go through all digits的方式。最右邊的位是由check % 2檢索,並且檢查它後,可以通過check /= 2check一個數字(位)向右移位(等於check = check/2;

+0

從僞代碼看來,二進制似乎不是'二進制'形式,而是'int'形式。此外,'二進制'就像循環計數器一樣。 而僅需要256個二進制數字? – Chin 2012-04-12 14:35:11

0

支票/ = 2等效於檢查=檢查/ 2;

它只是一種將多個賦值合併爲一個單獨賦值的方式,如sum + = 2相當於sum = sum + 2;

1

使用此算法,您將計算所有設置爲1的位並將其設置爲0

check /= 2; 

它就像

check = check/2; 

,你可以使用它的權利由一個所有位轉移。 例如:

(binary) 101/(decimal) 2 = (binary) 10 

101一個數量右移。

1

讓我們看看這一行:

check /= 2; 

在Java中它相當於下面的簡單語句:

check = check/2; 

現在,讓我們找出目的,它的背後:

  1. 最右邊的數字通過check % 2
  2. 然後它被右移一位數check /= 2