トップページに戻る    次のC++のサンプルへ    前のC++のサンプルへ

Problem10 200万以下の全ての素数の和

問題

10以下の素数の和は2 + 3 + 5 + 7 = 17である.
200万以下の全ての素数の和を計算しなさい.


ソース(エラトステネスのふるいを使う方法)

#include <iostream>
#include <vector>

void main()
{
    //const int TargetVal = 10;
    const int TargetVal = 2000000;
    std::vector<int> IntVect;
    for (int I = 0; I <= TargetVal+1; I++){
        IntVect.push_back(I);
    }

    for (int I = 2; I <= TargetVal; I++) {
        if (IntVect.at(I) != 0) {
            for (int J = IntVect.at(I) * 2; J <= TargetVal; J += IntVect.at(I)) {
                IntVect.at(J) = 0;
            }
        }
    }

    __int64 sumVal = 0;
    for (int I = 2; I <= TargetVal; I++){
        sumVal += IntVect.at(I);
    }
    std::cout << sumVal << std::endl;
}


ソース(エラトステネスのふるいを使わない方法)

#include <iostream>

bool IsPrime(int pCheckNo);

void main()
{
    //const int TargetVal = 10;
    const int TargetVal = 2000000;

    __int64 SumVal = 0;
    for (int I = 2; I <= TargetVal; I++) {
        if (IsPrime(I)){
            SumVal +=I;
        }
    }

    std::cout << SumVal << std::endl;
}

bool IsPrime(int pCheckNo)
{
    for (int I=2;I*I <= pCheckNo;I++){
        if (pCheckNo%I==0) return false;
    }
    return true;
}


実行結果

142913828922


解説

エラトステネスのふるいを使ってもいいですね。