如何解决被零除的异常?

问题描述 投票:-4回答:1

这是素数生成器在Sphere Online Judge (SPOJ)上的问题。

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

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

我将prime [0]和prime 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;
                }
            }
        }
    }

我试图用橡皮擦的筛子解决它。输出为:Exception in thread "main" java.lang.ArithmeticException: / by zero

java exception divide-by-zero
1个回答
0
投票

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

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

请参见Java if vs. try/catch overheadUsing 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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.