1. 程式人生 > >素數篩法 poj2689

素數篩法 poj2689

#include"cstdio"
#include"cstring"
using namespace std;
#define MAX 100000//求MAX範圍內的素數
long long su[MAX],cnt;
bool isprime[MAX];
void prime()
{
    cnt=1;
    memset(isprime,1,sizeof(isprime));//初始化認為所有數都為素數
    isprime[0]=isprime[1]=0;//0和1不是素數
    for(long long i=2;i<=MAX;i++)
    {
        if(isprime[i])
            su[cnt++]=i;//儲存素數i
        for(long long j=1;j<cnt&&su[j]*i<MAX;j++)
        {
            isprime[su[j]*i]=0;//篩掉小於等於i的素數和i的積構成的合數
        }
    }
}
int main()
{
    prime();
    for(long long i=1;i<cnt;i++)
        printf("%d  ",su[i]);
    return 0;
}












例題:

自己太傻了,poj2689

素數篩法

第一遍爆int,數論題極容易爆int吧,關鍵這也太難查了吧,我都不知道自己到底爆了多少次了,下次一定要注意才行

第二遍還要特判1,主要後面還好,前面爆int太慘了,不想看了,就是想交。

還有其實l-r範圍內的素數可以用sqrt(r)內的素數來篩

原理就是sqrt後面的合數都可以由前面的素數表示,而後面的素數一定要乘前面的數才可以表示

不可能存在兩個後半部分素數相乘的結果,(因為這樣就超過r了)