【问题标题】:Prime testing algorithm not working properlyPrime 测试算法无法正常工作
【发布时间】:2017-01-09 16:03:50
【问题描述】:

我有一个从 Project Euler 获得的主要测试算法,但是当 43 作为输入传递时它返回 false。概述中给出了伪代码,我将其转换为 c++ 代码。我可能在转换伪代码时犯了一个错误。该算法的实际问题是什么?

#include <iostream>
#include <cmath>

using namespace std;

bool is_prime(int n)
{
    if(n <= 1)
    {
         return false;
    }
    else if(n < 4)
    {
        return true;
    }
    else if(n % 2 == 0)
    {
        return false;
    }
    else if(n < 9)
    {
        return true;
    }
    else if(n % 3 == 0)
    {
        return false;
    }
    else
    {
        int r = sqrt(n);
        int f = 5;
        while(f <= r)
        {
            if(n % f == 0)
            {
                return false;
            }
            if((n + 2) % f == 0)
            {
                return false;
            }
            f = f + 6;
        }
       return true;
    }
}

int main()
{
    cout << is_prime(43);

    system("PAUSE");
    return 0;
}

【问题讨论】:

  • 大量括号和冗余elses 使您的代码不可读
  • 用值 43 调试它。然后你会看到哪里出了问题。如果您不喜欢调试器,请使用 printf-debugging。
  • 您在循环中的第二个测试是(43 + 2) % 5 == 0,这显然是正确的。
  • 编辑它以删除多余的条件

标签: c++ algorithm testing primes


【解决方案1】:

你的算法是正确的,但这里有以下错误

       if((n + 2) % f == 0)  //wrong
        {

            return false;
        }

应该是

      if(n%(f+2) == 0)  //Right
        {

            return false;
        }

【讨论】:

    【解决方案2】:

    您有一个算法错误。代替 (n+2)%f 它应该读 n%(f+2)

    【讨论】:

      【解决方案3】:

      其他人指出了您的错误。你可以稍微简化你的代码,减少所有那些if 语句:

      bool is_prime(int n)
      {
        if(n <= 1)
        {
           return false;
        }
      
        if(n % 2 == 0)
        {
          return n == 2;
        }
      
        if(n % 3 == 0)
        {
          return n == 3;
        }
      
        // Check for factors of 5, 7, ...
      

      【讨论】:

        猜你喜欢
        • 2017-01-24
        • 1970-01-01
        • 1970-01-01
        • 2019-09-06
        • 2014-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多