C#IsPrime跳过一个素数

时间:2014-08-13 12:17:00

标签: c#

我正在尝试紧固我的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;
    }

3 个答案:

答案 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;
};