Как исправить деление на ноль исключений? - PullRequest
0 голосов
/ 06 октября 2019

Это проблема для Sphere Online Judge (SPOJ) для простого генератора.

Ввод: число t тестовых случаев в одной строке (t <= 10). В каждой из следующих t строк есть два числа m и n. </p>

Вывод: для каждого теста выведите все простые числа p, такие что m <= p <= n. </p>

У меня естьсделал простое [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;
                }
            }
        }
    }

Я попытался решить его с помощью сита эратосфена. Выход: Exception in thread "main" java.lang.ArithmeticException: / by zero

1 Ответ

0 голосов
/ 06 октября 2019

Вы видите исключение деления на ноль, потому что оператор в вашей программе пытается разделить значение на ноль, и это не разрешено в Java или любом другом языке программирования, о котором я знаю.

Вы можете сделать две вещи: (1) проверить значение делителя и, если оно равно нулю, не делить или (2) перехватить исключение, используя try / catch.

См. Java if против try / catch overhead , а также Использование 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;
    }
}
...