我正在尝试紧固我的isPrime函数但是当我添加一个条件,如果数字可被2整除,则返回false而不是执行整个过程来查找数字是否为素数,但是当我这样做时,它会跳过一个数字,例如第6个素数是13,没有条件,如果它可以被2分割,我得到13,但是当我添加它时,我得到17。
static bool isPrime(long n)
{
bool prime = false;
int div = 0;
if (n % 2 == 0)
return false;
else
for (long i = 1; i < n + 1; i++)
{
if (n % i == 0)
div++;
if (div == 2)
prime = true;
else
prime = false;
}
return prime;
}
答案 0 :(得分:6)
你需要首先检查2的特殊情况,它甚至是素数。
作为额外的优化,您可以改善循环的界限;没有必要像n + 1
那样高。
答案 1 :(得分:5)
如果你想加快解决方案,你可以做类似的事情:
static bool isPrime(long n) {
// all integers less than 1 (1 is included) are not prime
if (n <= 1)
return false;
// Error in your code: 2 is prime, even if other even numbers aren't
if (n % 2 == 0)
return (n == 2);
// there's no need to loop up to n: sqrt(n) is quite enough
long max = (long) (Math.Sqrt(n) + 0.1);
// skip even numbers when looping: i +=2
for (long i = 3; i <= max; i += 2) {
// the early return the better
if (n % i == 0)
return false;
}
return true;
}
答案 2 :(得分:0)
if (n % 2 == 0)
return (n == 2);
如果将其与位级检查进行比较,则模块操作在大多数体系结构中都很慢。您可以选择仅检查每个数字的最低有效位,并获得偶数或奇数的答案。
使用1和值进行AND操作。结果告诉你它是否均匀。 例如:
100101011101 (the value to check)
000000000001 (bitmask to AND with)
000000000001 (the result after AND, still 1 ---> odd number (true in boolean))
所以:
if(!(value & 1))
{
//even
return false;
};