C++ 素数测试算法工作不正常

C++ 素数测试算法工作不正常,c++,algorithm,testing,primes,C++,Algorithm,Testing,Primes,我有一个基本测试算法,是从ProjectEuler得到的,但当43作为输入传递时,它返回false。伪代码是在概述中给出的,我将其转换成C++代码。我可能在转换伪代码时出错了。算法的实际问题是什么 #include <iostream> #include <cmath> using namespace std; bool is_prime(int n) { if(n <= 1) { return false; }

我有一个基本测试算法,是从ProjectEuler得到的,但当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;
}
#包括
#包括
使用名称空间std;
布尔是素数(整数n)
{

如果(n您有一个算法错误。而不是
(n+2)%f
应该是
n%(f+2)

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

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

            return false;
        }
应该是

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

            return false;
        }

其他人指出了您的错误。您可以稍微简化代码,减少所有
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, ...
bool是素数(int n)
{

如果(n)大量的括号和冗余,并且
否则
s使您的代码无法读取,请使用值43。这样,您将看到出现了什么问题。如果您不喜欢depuggers,请使用printf-debugger。循环中的第二个测试是
(43+2)%5==0,这显然是正确的。编辑它以删除冗余条件