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
答案 0 :(得分:0)
您看到除以零的异常是因为程序中的一条语句试图将一个值除以零,而这在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;
}
}