0

10,001 番目の素数を計算するProject Euler #7を実行しています。整数が素数であるかどうかを確認する簡単な関数を作成しました。

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;

私のコードの最初のバージョンは 1 秒もかからずに答えを得ますが、2 番目のバージョンは 1 分以上かかります。これがなぜなのかわかりません。確かに、2番目のバージョンはisPrime、より小さな範囲の数値を反復しているため、より高速である必要がありますか? 誰かがアドバイスを提供できる場合は、ありがとう。

4

1 に答える 1