2013-01-05 19 views
1
int count(int *a, int *b, int n) { 
    int i=0,j=0,roz=0; 

    while(i<n) { 
     while(j<n) { 
      if(a[i]==b[j]) 
       roz++; 
      j++; 
     } 
     i++; 
    } 
    return roz; 
} 

n是a的大小,或b陣列(兩者都是相同大小的)。嵌套的while循環似乎只能工作一次,因爲i = 0。接下來的事情似乎正在發生,將n奇蹟般地變爲1(它在開頭是5),這樣嵌套的while不會循環第二次。爲什麼?嵌套田地用C

有趣的是,呼應n右回報顯示正確的價值,這是5 ...

編輯之前。 for循環在這裏正常工作,但問題仍然存在。

+1

那麼,如果您讀取數組的末尾,則可能會調用未定義的行爲。也就是說,很難看出這會如何導致n被修改。你怎麼知道這是事實? –

+0

所以這應該算在兩個數組中相等的數字,對吧? – 2013-01-05 15:12:54

+0

這是正確的.. – khernik

回答

11

你永遠的j值重置爲0。

+0

該死,好點在這裏,謝謝,沒有看到這個! :D – khernik

+1

@khernik:這就是爲什麼你應該使用調試器逐行去除你的代碼。 –

+2

爲什麼在這種情況下for循環比while循環更受歡迎。使用for-loop語法忘記重置計數器更加困難。 –

3

您應該重置爲j 0兩者之間的嵌套循環。

while (i < n) 
{ 
    j = 0; 

    while (j < n) 
    { 
    if (a[i] == b[j]) 
     roz++; 
    } 
} 

你可以計算兩個數組的交集以更有效的方式(有一個O(N*log N)溶液)。

1

n的值在這裏沒有改變。對於i = 1或更高版本,嵌套循環未執行的原因是您沒有重置j的值。例如,n是5.當i = 0時,嵌套循環正確執行,j完成後值爲5。當i = 1時,j仍然是5,所以它永遠不會進入嵌套循環。

while(i<n) 
{ 
    j = 0; // reset j here to solve the problem 
    while(j<n) {} 
0

那麼通過查看邏輯,看起來你正在猜測兩個數組中的通用元素的數量。

您正在做的錯誤是您沒有在第一個while循環中將j的值重置爲0。