下面是代码(java):
class prime
{
public static boolean prime (int a, int b)
{
if (a == 0)
{
return false;
}
else if ((a%(b-1) == 0) && (b>2))
{
return false;
}
else if (b>1)
{
return (prime (a, b-1)) ;
}
else
{
return true;
}
}
public static void main (String[] arg)
{
System.out.println (prime (7, 7)) ;
}
}这是我尝试运行它时得到的错误消息(它编译得很好):
Exception in thread "main" java.lang.ArithmeticException: / by zero
at prime.prime(prime.java:10)
at prime.prime(prime.java:16)
at prime.prime(prime.java:16)
at prime.prime(prime.java:16)
at prime.prime(prime.java:16)
at prime.prime(prime.java:16)
at prime.prime(prime.java:16)
at prime.main(prime.java:27)所以这意味着我被零除了,对吗?或者这意味着什么呢?我不明白我怎么除以0。哪里出了问题?
发布于 2010-03-10 11:13:24
试着扭转局面
if ((a%(b-1) == 0) && (b>2))至
if ((b>2) && a%(b-1)==0)发生的情况是在b>2测试之前执行a%(b-1)操作。
切换之后,您可以利用short-circuit evaluation。一旦b>2测试返回false,就不需要计算模数(从而避免除法)
发布于 2010-03-10 11:12:37
由于您的递归调用:
return (prime (a, b-1)) ;在某个时刻,您将调用prime,b的值为1。这意味着在您的第二个条件下,您将测试a%0。由于模运算符(%)本质上是一个除法,这带来了除以零的问题。
解决方案可能是在执行%之前捕获这种情况,以在您的条件下强制执行b>2。
发布于 2018-09-13 01:17:22
A % B = C,%的数学含义是将A除以B,这个运算的提示符是C。当B为0时,你会有效地问:当我们被零除时,提醒是什么?然而,在数学中,被零除是未定义的,这就是java.lang.ArithmeticException的原因
https://stackoverflow.com/questions/2414250
复制相似问题