为什么迭代矢量这么慢?

时间:2013-05-13 11:20:55

标签: c++

我正在做Project Euler #7,你在那里计算第10,001个素数。我编写了一个简单的函数来检查整数是否为素数:

bool isPrime(int p)
{
    if (p % 2 == 0 || p <= 1)
    {
        return false;
    }
    for (int i=3; i<=(int)sqrt((double)p)+1; i+=2)
    {
        if (p % i == 0)
        {
            return false;
        }
    }
    return true;
}

然后在主程序中,我从2开始并迭代所有后续奇数,计算每个素数:

int count(1);
int i(1);
while (count != 10001)
{
    i += 2;
    if (isPrime(i))
    {
        count++;
    }
}

std::cout << "Answer: " << i << std::endl;

然后我认为我可以通过跟踪到目前为止找到的所有素数并将它们输入我的isPrime函数来改进这个函数,如下所示:

bool isPrime(int p, std::vector<int> primes)
{
    if (p <= 1) 
    {
        return false;
    }
    for (std::vector<int>::iterator it=primes.begin(); it!=primes.end(); it++)
    {
        if (p % *it == 0)
        {
            return false;
        }
        else if (*it > (int)sqrt((double)p)+1)
        {
            return true;
        }
    }
    return true;
}

主程序改为:

int count(1);
int i(1);
std::vector<int> primes(1,2);
while (count != 10001)
{
    i += 2;
    if (isPrime(i, primes))
    {
        count++;
        primes.push_back(i);
    }
}

std::cout << "Answer: " << primes.back() << std::endl;

我的代码的第一个版本在不到一秒钟内获得答案,而第二个版本需要一分钟。我不明白为什么会这样,当isPrime迭代一小部分数字时,第二个版本肯定会更快?如果有人可以提供任何建议,谢谢。

1 个答案:

答案 0 :(得分:3)

您应该将isPrime()的签名更改为

bool isPrime(int p, const std::vector<int>& primes)

每次调用函数时都要避免复制primes