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 の場合、1 回だけ機能するようです。次に起こっているように見えるのは、魔法のように n を 1 に変更することです (最初は 5 です)。 . どうしてこんなことに?

興味深いのは、戻り値の直前に n をエコーすると、正しい値である 5 が表示されることです...

編集。ここでは for ループが適切に機能しますが、問題はまだ存在します。

4

4 に答える 4

11

jの値を 0にリセットすることはありません。

于 2013-01-05T15:14:27.657 に答える
3

jネストされた 2 つのループの間で 0 にリセットする必要があります。

while (i < n)
{
  j = 0;

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

より効率的な方法で 2 つの配列の交差を計算できます (解決策がありO(N*log N)ます)。

于 2013-01-05T15:14:36.217 に答える
1

の値はnここでは変更されません。ネストされたループが i = 1 以降で実行されない理由は、j の値をリセットしていないためです。たとえば、n5 です。i = 0 の場合、ネストされたループは適切に実行され、終了後の j の値は 5 です。i = 1 の場合、j は 5 のままであるため、ネストされたループには入りません。

while(i<n)
{
    j = 0; // reset j here to solve the problem
    while(j<n) {}
于 2013-01-05T15:15:33.093 に答える
0

ロジックを見ると、両方の配列の共通要素の数を計算しているようです。

あなたがしている間違いは、最初の while ループで j の値を 0 にリセットしていないことです。

于 2013-01-05T15:17:55.263 に答える