首页 > 解决方案 > 如何修复除以零异常?

问题描述

这是Sphere Online Judge (SPOJ)上用于主生成器的问题。

输入:t单行中的测试用例数(t<=10)。在接下来的 t 行中的每一行中都有两个数字 m 和 n。

输出:对于每个测试用例,打印所有质数 p,使得 m <= p <= n。

我已将素数 [0] 和素数1设为 -1。

    int range[][] = new int[t][2];
    for (int i = 0; i < t; i++)     //take t ranges
    {
        for(int j = 0; j < 2; j++)
        {
            range[i][j] = sc.nextInt();
        }

    }
    for(int i = 0; i < t; i++)                       
    {
        int prime[] = new int[range[i][1]+1];
        for(int k = 2; k <= range[i][1]; k++)
        {
            prime[k] = k;
        }
        prime[0] = -1;
        prime[1] = -1;
        for(int k = 2; k <= range[i][1]; k++)
        {
            for(int m = k + 1; m < range[i][1]; m++)
            {
                int x = prime[k];
                if(prime[m] % x == 0)
                {
                    prime[m] = 0;
                }
            }
        }
    }

我试着用eratosthenes的筛子解决它。输出是: Exception in thread "main" java.lang.ArithmeticException: / by zero

标签: javaexceptiondivide-by-zero

解决方案


您看到除以零异常是因为您的程序中的一条语句试图将一个值除以零值,而这在 Java 或我所知道的任何其他编程语言中是不允许的。

您可以做两件事,(1)检查除数的值,如果它为零,则不要进行除法或(2)使用 try/catch 捕获异常。

参见Java if vs. try/catch 开销以及Using try-catch java

查看您的代码,我不确定除以零的位置,尽管它可能是您使用模运算符 ( %) 检查除法的余数是否为零的区域:

for(int m=k+1; m<range[i][1]; m++)
{
    int x = prime[k];
    if(prime[m] % x == 0)  // use modulus operator to check the remainder
    {
        prime[m] = 0;
    }
}

您可能想要执行以下操作:

for(int m=k+1; m<range[i][1]; m++)
{
    int x = prime[k];
    if(x == 0 || prime[m] % x == 0)  // use modulus operator to check the remainder
    {
        prime[m] = 0;
    }
}

推荐阅读