Tony's Log

Algorithms, Distributed System, Machine Learning

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
bool IsInvalid (int i) { return i == -1; }
void sieve_prime(vector<int> &prims)
{
    prims.reserve(50000);
    for(unsigned i = 2; i < 50001; i ++)
    {
        prims.push_back(i);
    }

    int sieveCnt = 1;
    int strtPrim = 2;
    while(sieveCnt > 0)
    {
        //printf("\n-- Prime base: %d --\n", strtPrim);
        sieveCnt = 0;
        for(unsigned j = 0; j < prims.size(); j++)
        {
            if(prims[j] % strtPrim == 0 && prims[j] != strtPrim && prims[j] != -1)
            {
                //printf("\t%d", prims[j]);
                prims[j] = -1;
                sieveCnt ++;
            }
        }
        //printf("\n-- Sieved cnt: %d\n", sieveCnt);
        if(sieveCnt > 0)
        {
            prims.erase(std::remove_if(prims.begin(), prims.end(), IsInvalid), prims.end());
        }

        //     Find next prim: use upper_bound
        vector<int>::iterator it = std::upper_bound (prims.begin(), prims.end(), strtPrim);
        if(it == prims.end())    break;
        else            strtPrim = *it;
    }
}
View Code

 

posted on 2014-03-08 01:47  Tonix  阅读(164)  评论(0)    收藏  举报