数学基础-素数筛法

来源:互联网 发布:小站tpo模考软件 编辑:程序博客网 时间:2024/05/18 15:26
//HDU - 2136 #include <stdio.h>#include <string.h>#include <algorithm>#include <utility>#include <queue>#define MAX 1000000using namespace std;int lpf[MAX];int main(){    int n,cnt,i,j;    memset(lpf,0,sizeof(lpf));    lpf[2]=1;    for(i=4;i<MAX;i+=2)        lpf[i]=lpf[2];    cnt=2;    for(i=3;i<MAX;i+=2){        if(lpf[i])            continue;        lpf[i]=cnt++;        for(j=(i<<1);j<MAX;j+=i)            lpf[j]=lpf[i];    }    while(~scanf("%d",&n))        printf("%d\n",lpf[n]);    return 0;}
//HDU - 2098 #include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<cctype>#include<algorithm>#include<vector>#include<set>#include<queue>#include<deque>using namespace std;const int maxn=10005;int notprime[maxn];void init(){    memset(notprime,0,sizeof(notprime));    notprime[0]=notprime[1]=1;    for(int i=2;i<maxn;i++)        if(!notprime[i]){            if(i>maxn/i)continue;            for(int j=i*i;j<maxn;j+=i)                notprime[j]=1;        }//  for(int i=0;i<20;i++){//      cout<<i<<" "<<notprime[i]<<endl;//  }}int main(){    init();     int inp;    while(cin>>inp&&inp){        int cnt=0;         int mid=(inp+1)/2;        for(int i=inp;i>=mid;i--){            if(!notprime[i]&&!notprime[inp-i]&&2*i!=inp){                cnt++;//              cout<<i<<" "<<inp-i<<endl;             }        }        cout<<cnt<<endl;    }    return 0;}
0 0