指尖起舞
手把青秧插满田,低头便见水中天;身心清静方为道,退步原来是向前。

导航

 

 

 

位工具

void setbit(int pos, unsigned char * flags)
{
    unsigned char on = 1 << (pos % 8);
    flags[pos / 8] |= on; 
}

void unsetbit(int pos, unsigned char * flags)
{
    unsigned char on = ~(1 << (pos % 8));
    flags[pos / 8] &= on; 
}

bool getbit(int pos, unsigned char * flags)
{
    if((flags[pos / 8] & (1 << (pos % 8))) > 0)
        return 1;
    return 0;
}

 

查找素数

void FindPrimeNums(int n)
{
    int flags_occupy = (n + 1) / 8 + 1;
    unsigned char * flags = new unsigned char[flags_occupy];
    memset(flags, 0xFF, flags_occupy);

    int laste = sqrt(n);
    for (int i = 2; i <= n; ++ i)
        if (getbit(i, flags))
        {
            cout << i << "\t";
            if(i <= laste)
                for (int j = 2; j * i <= n; ++ j)
                    unsetbit(i * j, flags);
            
        }

    cout << endl;
    delete[] flags;
}

 

去掉平方判断

void FindPrimeNums2(int n)
{
    int flags_occupy = (n + 1) / 8 + 1;
    unsigned char * flags = new unsigned char[flags_occupy];
    memset(flags, 0xFF, flags_occupy);

    for (int i = 2; i <= n; ++ i)
        if (getbit(i, flags))
        {
            cout << i << "\t";
            for (int j = 2; j * i <= n; ++ j)
                unsetbit(i * j, flags);
        }
        cout << endl;
        delete[] flags;
}

 

测试

#include <iostream>
#include <vector>
#include<ctime>


using namespace std;


class CTimer
{
public:
    CTimer()
    {
        _start=clock();
    }

    ~CTimer()
    {
        _end=clock();
        cout<< float(_end - _start) / CLK_TCK <<endl;
    }
private: 
    clock_t _start;
    clock_t _end;
};



int main()
{
    CTimer * pct = new CTimer; 
    FindPrimeNums(20000000);
    delete pct;
    pct = new CTimer; 
    FindPrimeNums2(20000000);
    delete pct;
    return 0;
}

测试结果:

   去除打印时间,查找20000000以内的素数,排除平方根以上的候选数可以调高20%左右的时间。

    如图:

 

posted on 2016-08-01 00:36  datakv  阅读(184)  评论(0编辑  收藏  举报