5

コードは次のとおりです(java):

class prime
{

    public static boolean prime (int a, int b) 
    { 
        if (a == 0) 
        {
            return false; 
        }
        else if ((a%(b-1) == 0) && (b>2))
        {
            return false; 
        }
        else if (b>1) 
        {
            return (prime (a, b-1)) ;
        }
        else
        {
            return true; 
        }

    }

    public static void main (String[] arg) 
    {
        System.out.println (prime (7, 7)) ; 
    }
}

これは、実行しようとしたときに表示されるエラーメッセージです(正常にコンパイルされます)。

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at prime.prime(prime.java:10)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.main(prime.java:27)

つまり、これは私がゼロで除算したことを意味しますか?またはそれは何か他のものを意味しますか?ゼロ除算がわかりません。何が悪かったのか?

4

4 に答える 4

15

これを好転させてみてください

if ((a%(b-1) == 0) && (b>2))

   if ((b>2) && a%(b-1)==0)

何が起こっているのかというと、テストa%(b-1)の前に操作が実行されているということです。b>2

切り替え後は、短絡評価を利用しています。b> 2テストがfalseを返すと、モジュラスを計算する必要はありません(したがって除算を回避します)

于 2010-03-10T03:13:24.183 に答える
2

再帰呼び出しのため:

return (prime (a, b-1)) ;

ある時点で、bの値が1のprimeを呼び出すことになります。これは、2番目の条件でテストすることを意味しますa%0。モジュロ演算子(%)は本質的に除算であるため、ゼロ除算の問題が発生します。

解決策は、%を実行する前に、このケースをキャッチして、条件にb>2を適用することです。

于 2010-03-10T03:12:37.420 に答える
0

フォームのコードはすべてx % 0このエラーをスローすると思います。あなたのコードはこの可能性を防ぎません。

于 2010-03-10T03:12:32.300 に答える