测试数字是否为素数的功能?

时间:2015-01-27 16:59:41

标签: c# c++ algorithm primes

我需要一种方法来检查给定数字是否为素数。我在互联网上搜索,我找到了不同的功能,但它们很复杂。所以,我设计了自己的方法来检查数字是否为素数。它对我有用。我只是想知道它是否正确。代码如下:

bool IsPrime(int n)
{
    for (int i = 2; i <= 7; i++)
    {
        if (i < n && n % i == 0)
        {
            return false;
        }
        if (i == n)
        {
            return true;
        }
    }
    return true;
}

2 个答案:

答案 0 :(得分:0)

简短回答:不,这不正确。

答案:这是工作代码:

bool IsPrime(int n)
{
    if (n <= 1) return false;      // .. , -1, 0, 1
    if (n == 2) return true;        // 2
    if (n % 2 == 0) return false;    // 4, 6, 8, ...
    int sqrt = (int)Math.Sqrt(n); // largest possible factor        
    for (int i = 3; i <= sqrt; i+=2)
    {
        if (n % i == 0)
        {
            return false;
        }
    }
    return true;
}

备注:很多算法可以更好,更快地运行...

<小时/>

修改

使用@ Blastfurnace的想法以及其他一些优化版本:

bool IsPrime(int n)
{
    if (n <= 1) return false;      // .. , -1, 0, 1    
    if (n % 2 == 0) return (n==2);    // 2 and even numbers
    if (n % 3 == 0) return (n==3);    // 3 and divisible by 3
    if (n % 5 == 0) return (n==5);
    if (n % 7 == 0) return (n==7); // the magic 7 from OP 
    if (n < 11) return false;
    // calc sqrt as rare as possible, its expensive
    int sqrt = (int)Math.Sqrt(n); // largest possible factor  
    // skip 9, already done with n%3
    for (int i = 11; i <= sqrt; i+=2) if (n % i == 0) return false;

    return true;
}

这应该可以节省一些CPU周期。

答案 1 :(得分:0)

根据素数的定义,“如果一个大于1的整数只有正数除数(因子)为1且它本身就称为素数。”,0和1不是素数。

修正DrKoch的答案:

bool IsPrime(int n)
{
    if( n == 0 || n == 1)
       return false;
    else if(n == 2)
       return true;
    else if(n%2 == 0)
       return false;
    else {
       int sqrt = (int)Math.Sqrt(n);

       for (int i = 3; i <= sqrt; i+=2)
       {
           if (n % i == 0)
              return false;
       }

       return true;
    }
}