我有一个主要测试算法,我从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;
}
答案 0 :(得分:2)
你的算法是正确的,但这里有错误
if((n + 2) % f == 0) //wrong
{
return false;
}
应该是
if(n%(f+2) == 0) //Right
{
return false;
}
答案 1 :(得分:0)
您有算法错误。代替
(n+2)%f
它应该读
n%(f+2)
答案 2 :(得分:0)
其他人指出了你的错误。您可以稍微简化代码,减少所有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, ...