• poj2689素数问题


    打算重新刷一下数论题,忘了很多了,水平也很差,此题入手就不顺了,刷了一个早上,只是一个简单
    的素数应用罢了。题意:找出区间长度不超过10^6的最近的素数和最远的素数(相邻的),
    算法:数在int范围内,不可能全部一次筛出,所以先筛出50000以内的质数,其他整数(若是合数)必然
    至少含有一个50000以内的质因子,所以,对每次区间,再筛,筛去区间中这些质数的倍数即可。
    未1A原因:
    1,题意要看清!
    2,注意细节问题!以及特殊情况!

    3.注意边界!虽然是整数范围,刚好在上界时候在for里循环再加的话就越界了,无法判断! 

    #include<iostream>  //49ms
    #include<cstdio>
    #include<vector>
    #include<cstring>
    using namespace std;
    bool notpri[50001]; vector<int>pri;
    long long f,l;
    void getpri()      //先筛出部分质数
    {
        notpri[1]=1;
        for(int i=2;i<=50000;i++)
          {
              while(i<=50000&¬pri[i]==1)i++;
              pri.push_back(i);
             for(int j=2*i;j<50001;j=j+i)
                  notpri[j]=1;
          }
    }
    int nowpri[1000001];        //将区间f,l平移到0--l-f。
    int main()
    {
        getpri();
        while(~scanf("%lld%lld",&f,&l))
        {
            while(f<2)f++;      //排除1的情况
            for(long long i=f;i<=l;i++)  //初始化
             {
                 nowpri[i-f]=0;
             }
            int len=pri.size();
            for(int i=0;i<len;i++)       //筛去l--f之间的合数
            {
                long long start=f+(pri[i]-f%pri[i]);
        if(f%pri[i]==0)start-=pri[i];        //起点注意一下,细节 
                if(start==pri[i])start+=pri[i];
                for(long long j=start;j<=l;j=j+pri[i])
                      nowpri[j-f]=1;             //j is not prime
            }
            int dis=0;
            int  mindis=1000001;int maxdis=-1;
            long long  maxi1=0,maxi2=0,mini2=0,mini1=0;
            int mark1=1;long long pre=0;
            for(long long i=f;i<=l;i++)  //距离统计一下
            {
                if(nowpri[i-f]==0)
               {
                   if(mark1)
                   {
                       mark1=0;pre=i;maxi1=maxi2=i;mini1=mini2=i;dis=1;continue;
                   }
                   if(dis>maxdis)
                   {
                       maxdis=dis;maxi1=pre;maxi2=i;
                   }
                   if(dis<mindis)
                   {
                       mindis=dis;mini1=pre;mini2=i;
                   }
                  pre=i; dis=0;
               }
               dis++;
            }
            if(maxdis<0)
              printf("There are no adjacent primes.
    ");
           else
             printf("%lld,%lld are closest, %lld,%lld are most distant.
    ",mini1,mini2,maxi1,maxi2);
        }
        return 0;
    }
    


  • 相关阅读:
    u-boot 用哪个lds链接脚本
    u-boot-2019.07 移植步骤
    u-boot-2016.09 make编译过程分析(二)
    grep 命令搜索 带空格的字符
    uboot if_changed函数
    2019保险规划 待完善
    MongoDB Capped集合
    并发编程——详解 AQS CLH 锁
    Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
    观察者模式
  • 原文地址:https://www.cnblogs.com/yezekun/p/3925749.html
Copyright © 2020-2023  润新知