这是代码(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)
所以这意味着我除以零一些如何正确?或者它意味着什么?我不知道我是如何除以零的。什么地方出了错?
试着转过来
if ((a%(b-1) == 0) && (b>2))
至
if ((b>2) && a%(b-1)==0)
发生的事情是a%(b-1)
操作正在b>2
测试之前执行。
切换后,你正在利用short-circuit evaluation。一旦b> 2测试返回false,则无需计算模数(因此避免了除法)
因为你的递归电话:
return (prime (a, b-1)) ;
你将在某个时候调用素数为b为1的值。这意味着在你的第二个条件下你将测试a%0
。由于模运算符(%)本质上是一个除法,这就是将你的除以零问题。
解决方案可能是为了捕捉这种情况,在执行%之前强制执行b> 2。
我假设x % 0
形式的任何代码都会抛出此错误。您的代码无法防范这种可能性。
A % B = C
%
的数学意义是你用A
划分B
,并且提醒你这个操作是C
。当B
是0
时,你有效地询问当我们除以零时的提醒是什么。在数学中虽然被零除以是未经分解的,这就是java.lang.ArithmeticException
的原因