这是素数生成器在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或我所知道的任何其他编程语言中都不允许这样做。
您可以做两件事,(1)检查除数的值,如果它是零,则不进行除法运算;(2)使用try / catch捕获异常。
请参见Java if vs. try/catch overhead和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;
}
}