poj 2689 Prime Distance 筛素数加强版


这题敲得我好感人啊,踌躇了几天,终于干掉它了


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

typedef long long ll;
ll l,u;
ll a[50010];
ll b[50010];
ll c[1000100];
ll d[1000100];
ll k = 0;
void init()
{
    ll i,j;
    memset(a,0,sizeof(a));
    for(i=2;i<=50000;i++)
    {
        if(a[i]==0)
        {
            b[k++]=i;
            for(j = i*i;j<=50000;j+=i)
            {
                a[j] = 1;
            }
        }
    }
    return ;
}
int main()
{
    std::ios::sync_with_stdio(false);
    ll i,j;
    init();
    //freopen("a.txt","w",stdout);
    while(cin>>l>>u)
    {
        memset(c,0,sizeof(c));
        for(i=0;i<k&&b[i]*b[i]<=u;i++)
        {
            j = l/b[i];
            if(j==1)
                j++;
            if(j==0)
                j+=2;
            if(l%b[i])
                j++;             //没有加这句话,于是一天的噩梦开始了,卧槽。
            for(;j*b[i]<=u;j++)  //  交上去RE之后,全部改成了long long 类型                
            {                    //   可是WA,于是看了一下b数组,卧槽,b[4776]的值在i==4000多的时候
                c[j*b[i]-l]=1;   //莫名其妙的变成了1,肺都气炸了,都没找到答案。后来改了c[i]=2;
            }                    //发现b[4776]也变成了2,卧槽,我改变c数组的值,把b数组的值也改变了   
        }                        //后来才知道他下标变成了负值,访问到b数组去了,居然不报错,跟python
        if(l==1)                 //似的,可以负值访问啊,哎,而且,两个数组的内存区域居然是连续的
            c[0]=1;              //数组访问在该内存区域没有被声明才报错,终于明白这种隐晦的错误了 
        ll s = 0;
        for(j=0;j<=u-l;j++)
        {
            if(c[j]==0)
            {
                d[s++]=j;
            }
        }
        ll maxx,minn;
        maxx=0;
        minn=0x7ffffffffLL;
        ll pos1,pos2,pos3,pos4;
        for(j=1;j<s;j++)
        {
            if(d[j]-d[j-1]>maxx)
            {
                maxx = d[j]-d[j-1];
                pos1 = d[j-1];
                pos2 = d[j];
            }
            if(d[j]-d[j-1]<minn)
            {
                minn = d[j]-d[j-1];
                pos3 = d[j-1];
                pos4 = d[j];
            }
        }
        if(maxx == 0)
        {
            cout<<"There are no adjacent primes."<<endl;
        }
        else
        {
            cout<<pos3+l<<','<<pos4+l<<" are closest, "<<pos1+l<<","<<pos2+l<<" are most distant."<<endl;
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值