我们如何在此代码中使用sqrt(n)
代替n/2
?使用sqrt(n)
是否正确?
static boolean isPrime(long n)
{
if(n<=1) return false;
double limit = Math.sqrt(n);
for(long i = 2; i <= limit; i++)
{
if(n%i==0) return false;
}
return true;
}
答案 0 :(得分:8)
如果n
不是素数,请说n = p * q
,则p
和q
不能都大于sqrt(n)
(否则p*q
将大于n
)
答案 1 :(得分:1)
如果n可被整除,则所示算法会检查2和sqrt(n)之间的每个整数。
如果n可以被大于sqrt(n)的数字整除,比如说a
,则会有b
因子a * b = n
和b < a
。在这种情况下,算法将找到b“first”并且看到n不是素数。
因此无需检查任何数字&gt; SQRT(N)。
答案 2 :(得分:0)
如果你不使用sqrt(),那么代码可能更容易理解(也更快)。
for (long i = 2; i*i <= n; i = (i==2) ? 3 : i+2) {
....
}
考虑我 i&gt; n,n可被i整除,因此n / i = m。那么m必须小于i。但这意味着你的循环必须早已遇到过,并发现n可以被m整除。所以这意味着你可以通过循环2..k来找到n的所有除数,其中k k&lt; = n。
如果计算素数列表,您还可以利用如果n不是素数,它必须可以被素数整除的事实。因此,仅检查低于或等于sqrt(n)的素数就足够了。由于素数比该范围内的普通数少得多,因此您的代码运行速度会更快。您可以从已经计算的列表部分中获取素数。