【问题标题】:function for testing whether the number is prime or not?测试数字是否为素数的功能?
【发布时间】:2015-01-27 16:59:40
【问题描述】:

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

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

【问题讨论】:

  • 为什么是 7?您不需要测试i 的每个值,直到并包括n 的平方根?
  • 打电话给IsPrime(121),看看你觉得对不对。
  • 如果您想知道它是否正确,请对其进行单元测试或证明。
  • 你会想要测试超过 7。这会认为 11 不是素数。
  • 您的函数逻辑表明,如果一个数不能被 2 到 7 之间的任何数整除,则该数是素数。这不是素数的定义。正如其他人所说,121 不能被 2、3、4、5、6 或 7 整除,但仍然不是素数。

标签: c# c++ algorithm primes


【解决方案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;
    }
}

【讨论】:

  • 感谢您改进我的代码。您的实现认为 -1 是素数。
  • 我假设不允许有负数。
  • 你知道:一个好的程序员在过马路之前会看两个方向——即使是单向的路......
  • 请注意语句“return true;”在您编辑的答案中超出了函数的主体。
【解决方案2】:

简答:不,不正确。

友好的回答:这是工作代码:

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 是。 1 和 2 都需要特殊情况。
  • 另一种特殊情况下 2 的倍数的方法是说 if (n % 2 == 0) return (n == 2);。那么你就不会测试奇数来查看它们是否等于 2。
  • @Blastfurnance 好吧 - 这用我大脑中的一些周期替换了 CPU 中的几个周期来理解我的代码...... ;)
猜你喜欢
  • 2016-03-02
  • 2015-08-28
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
相关资源
最近更新 更多