如何解决除零异常?

时间:2019-10-06 17:32:04

标签: java exception divide-by-zero

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

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

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

我将prime [0]和prime 1设为-1。

#include <stdio.h>
#include <stdbool.h>

bool is_prime_recursive(unsigned number, unsigned odd_divisor)
{
    if (odd_divisor * odd_divisor > number) {
        return true;
    }

    if (number % odd_divisor == 0) {
        return false;
    }

    return is_prime_recursive(number, odd_divisor + 2);
}

bool is_prime(int number)
{
    if (number <= 1) {
        return false;
    }

    if (number % 2 == 0) {
        return (2 == number);
    }

    return is_prime_recursive(number, 3);
}

int main()
{
    for (int i = 0; i <= 100; i++)
    {
        printf("%d is %sprime\n", i, is_prime(i) ? "" : "not ");
    }

    return 0;
}

我试图用橡皮擦的筛子解决它。输出为: t

1 个答案:

答案 0 :(得分: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;
    }
}