0
import java.util.*;

public class FirstOddOccurrence {
    public static void main(String[] args) {
        int[] x = {2, 4, 6, 7, 4, 3, 2, 7, 6, 7, 7};
        int i;

        display(x);

        System.out.printf("# Occurrences of first odd = %3d\n", firstOddCount(x));
    }

    private static void display(int[] x) {
        int i;

        System.out.print("Array: ");
        for (i = 0; i < x.length; i++) {
            if (i < x.length - 1)
                System.out.printf("%3d, ", x[i]);
            else
                System.out.printf("%3d\n", x[i]);
        }
    }

    public static int odd(int[] x) {
        int i;
        int y;
        for (i = 0; i < x.length; i++) {
            y = x[i] % 2;
            if (y == 1) {
                return x[i];
            } else {
                return 0;
            }
        }
        return x[i];
    }

    public static int firstOddCount(int x[]) {
        int i;
        int c = 0;
        for (i = 0; i < x.length; i++) {
            if (x[i] == odd(x))
                c++;

        }
        return c;
    }
}

提供された配列で最初に出現する奇数を見つけようとしています。プログラムの何が問題になっていますか? プログラムに最初の奇妙な出現を数えさせることができないようです。

4

4 に答える 4

2

ここにあなたのコード:

if (y == 1) {
    return x[i];
} else {
    return 0;
}

は機能しません - テストされた数が偶数の場合、すぐに を返し0ます。代わりに、これらの偶数をスキップして、奇数が現れるまで待ちます。最後に、奇数が見つからない場合は、 を返し0ます。の修正版は次のodd()とおりです。

int i;
int y;
for (i = 0; i < x.length; i++) {
    y = x[i] % 2;
    if (y == 1) {
        return x[i];
    }
}
return 0;
于 2013-01-18T04:23:40.333 に答える
1

Andr のソリューションは問題を解決します。odd(x) は、x[0] が偶数の場合は 0 を返し、奇数の場合は x[0] を返します。

次のように firstOddCount を改善することもできます。odd(x) は常に同じ値を返すため、一度だけ計算してください。

public static int firstOddCount(int x[]) {
   int firstOdd = odd(x);
   int c=0;
   for(int i=0; i < x.length; i++) {
       if (x[i]==firstOdd)
            c++;
   }
   return c;

}

于 2013-01-18T04:28:44.673 に答える
0

あなたの特定の問題は0、偶数を見つけた場合に戻ることです。これは、リストが最初の奇数としてではなく{2, 4, 6, 8, 1}を与えることを意味します。01

すべきこと、先頭の偶数を無視して、リストの処理を続行することです。

ただし、プログラムを編成した方法では、リストの最初の偶数部分を 2 回処理しています。1 回odd() 目は最初の奇数を見つけ、次にfirstOddCount()その数がいくつあるかを数えます不要。

最初の奇数を見つけたら、その数 (またはその他の奇数) が既に検索した空間に存在しないことを合理的に確信できると思います。そうなければ、それは最初の奇数だったでしょう。したがって、戻ってリストの最初の部分をもう一度見ることはほとんど意味がありません。

リストを一度だけ簡単に処理できる方法は次のとおりです。

public static int firstOddCount (int numbers[]) {
    // Find first odd number or end of list.

    int idx = 0, len = numbers.length;
    while ((idx < len) && ((numbers[idx] % 2) == 0)
        idx++;

    // If at end of list, everything is even => count(first(odd)) is 0.

    if (idx == len)
        return 0;

    // Otherwise, start counting from current position.

    int count = 1, oddnum = numbers[idx];
    while (++idx < len)
        if (numbers[idx] == oddnum)
            count++;

    return count;
}
于 2014-03-14T05:52:25.987 に答える
-1

グループから1つの要素を取得しようとしている場合は、条件が最初に一致したときに「ブレーク」を使用する必要があります。そうしないと、すべてが得られます...

于 2013-01-18T04:24:48.293 に答える