【问题标题】:Why is it implying I'm dividing by zero?为什么它暗示我除以零?
【发布时间】:2013-06-05 03:25:43
【问题描述】:

我正在从 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 不同,所以没有理由除以零,这是我自己能找到的唯一解释。

提前谢谢你。

【问题讨论】:

  • 除被零除之外的许多条件都可能触发 ArithmeticException。例如,导致虚数或整数溢出的操作。如果您确定它不是 div0,则很可能是溢出。
  • 当你从 s.nextInt() 插入值时可能得到0
  • 您没有从异常中获得其他信息吗??
  • 溢出?您的除数为 j 的平方,这可能导致值为零。
  • 他们没有显示测试用例,但我相信他们不会插入 0,因为它应该是一个长度度量。没有其他信息,仅此而已。

标签: java if-statement divide-by-zero arithmeticexception


【解决方案1】:

您看到了溢出。 试试下面的输入,可以得到 ArithmeticException。

1
256 256

【讨论】:

    【解决方案2】:

    如果b*c 很大,j 最终将等于 2147418112 65536 (=216) 和 j*j 将是 0 (请记住,Java ints 始终是 32 位)。当除数为0 时执行% 会得到ArithmeticException。请注意,65536 的任何倍数都会导致此错误。上面最初引用的2147418112 (=231-216) 只是适合int 的最大倍数。

    示例代码(您可以在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!");
        }
    }
    

    【讨论】:

    • 你是对的!我永远不会考虑'int'属性。谢谢!
    • @Bobby 谢谢。请注意,我犯了一个错误,真正的限制是 2^16(或 65536),这对我来说应该从一开始就很明显。我想我需要睡觉了:)
    • 没问题,我明白你的意思。 =]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    相关资源
    最近更新 更多