prime

来源:互联网 发布:java 密码 正则表达式 编辑:程序博客网 时间:2024/04/30 15:48
#include<iostream>#include<string.h>using namespace std;const int MAX=10000000;bool visit[MAX];int prime[670000];int num=0;void getprime(){  memset(visit,true,sizeof(visit));  visit[1]=false;  long long int i,j;  for(i=2;i<=MAX;i++)    if(visit[i])    {      num++;      prime[num]=i;      for(j=i*i;j<=MAX;j+=i)        visit[j]=false;    }}int main(){  getprime();  cout<<num;}





线性筛,还有注意区间。poj2689

#include<stdio.h>#include<string.h>const int n=50000;int prime[n],num=0;bool p[1000100];bool visit[n];void getprime(){    memset(visit,true,sizeof(visit));    int i,j;    for(i=2;i<=n;i++)    {        if(visit[i]) prime[num++]=i;        for(j=0;j<num;j++)        {            if(i*prime[j]>n) break;            visit[i*prime[j]]=false;            if(i%prime[j]==0) break;        }    }}int main(){    getprime();    int r,l,i,j,s,t,d;    while(scanf("%d%d",&l,&r)!=EOF)    {        memset(p,true,sizeof(p));        if(l==1) l++;        for(i=0;i<num;i++)        {            s=(l-1)/prime[i]+1;            t=r/prime[i];            for(j=s;j<=t;j++)                if(j>1) p[j*prime[i]-l]=false;        }        int mina=0,minb=0x7fffffff,maxa=0,maxb=0;        for(i=0;i<=r-l;i++)            if(p[i])            {                d=i;                break;            }        for(i=d+1;i<=r-l;i++)            if(p[i])            {                if(i-d>maxb-maxa)                {                    maxb=i;                    maxa=d;                }                if(i-d<minb-mina)                {                    minb=i;                    mina=d;                }                d=i;            }        mina+=l;        minb+=l;        maxa+=l;        maxb+=l;        if(maxb!=l) printf("%d,%d are closest, %d,%d are most distant.\n",mina,minb,maxa,maxb);        else printf("There are no adjacent primes.\n");    }}


0 0
原创粉丝点击