1

私はHackerRank.comからいくつかの演習を解いており、コードはNetbeansやテストケースのページコンパイラでも完全に機能しますが、コードを送信すると、すべてのテストでこのエラーがスローされます(最後を除く):

ArithmeticException: Solution.main(Solution.java:15) でスローされます

コードは次のとおりです。

     Scanner s = new Scanner(System.in);
     int a = s.nextInt(),j=1;
     for(int i=0; i<a; i++){
         int b = s.nextInt(), c =s.nextInt();
         for(j = b*c; j>0;j--) {
         if((b*c)%(j*j)==0){
             System.out.println(b*c/(j*j));
             break;}
         } 
     }

15 行目は次のとおりです。

    if((b*c)%(j*j)==0){

声明の何が問題になっていますか?for ループで 'j' を 0 とは異なる値に設定したので、0 で割る理由はありません。これが自分で見つけた唯一の説明でした。

前もって感謝します。

4

2 に答える 2

1

オーバーフローが発生しています。次の入力を試すと、ArithmeticException を取得できます。

1
256 256
于 2013-06-05T03:57:23.760 に答える
0

b*cが大きい場合、j最終的に(=2 16 ) になり、(Javaは常に 32 ビットであることを思い出してください) になります。除数が のときに実行すると、. の倍数でこのエラーが発生することに注意してください。上記で最初に参照された(=2 31 -2 16 ) は、 に収まる最大の倍数です。2147418112 65536j*j0ints%0ArithmeticException655362147418112int

サンプルコード ( http://ideone.com/iiKloYで自分で実行できます):

public class Main
{ 
     public static void main(String []args)
     {
        // show that all multiples of 65536 yeild 0 when squared
        for(int j = Integer.MIN_VALUE; j <= Integer.MAX_VALUE - 65536; j += 65536)
        {
            if((j*j) != 0)
            {
                System.out.println(j + "^2 != 0");
            }
        }
        System.out.println("Done!");
    }
}
于 2013-06-05T03:48:59.237 に答える