博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ--2689-C++
阅读量:4662 次
发布时间:2019-06-09

本文共 1403 字,大约阅读时间需要 4 分钟。

题意很简单就是让你求给定区间的素数,然后用一个循环求出相距最远的相邻素数数和最近的素数以及相距最近的相邻素数
难点在与数据很大,所以不可能直接对区间的每一个数进行素数判断。但是,每个合数n都至少有一个因数在2到根号n(以此来筛去该合数),同时这其中U的最大值为2的31次方,对其开方得46000+,这个数据的大小在可接受范围内,所以可以用2到根号U之间的素数来筛去L到U区间的合数。
#include<iostream>
#include<cstring>
#include<utility>
#include<cmath>
#define N 1000000
#define M 50000
using namespace std;
int primes[M];
bool judge[M];
bool p[N];
int b[N];
int cnt;
void getPrimes(int n);
int main()
{
    int L,U;
    while(cin>>L>>U)
    {
        getPrimes(sqrt(U));
        memset(p,true,sizeof p);
        if(L==1)
            p[0]=false;
        for(int i=0;i<cnt;i++)
            for(int j=ceil(L/primes[i]);j<=floor(U/primes[i]);j++)
                if(j!=1)
                    p[primes[i]*j-L]=false;
        pair<int,int> p1,p2;
        int cnt2=0;
        for(int i=0;i<U-L+1;i++)
            if(p[i])
            b[cnt2++]=(L+i);
        if(cnt2<2)
            cout<<"There are no adjacent primes."<<endl;
        else
        {
          int max_nu=0,min_nu=10000;
          for(int i=0;i<cnt2-1;i++)
          {
              if(b[i+1]-b[i]>max_nu)
                {
                    max_nu=b[i+1]-b[i];
                    p1.first=b[i];
                    p1.second=b[i+1];
                }
                if(b[i+1]-b[i]<min_nu)
                {
                    min_nu=b[i+1]-b[i];
                    p2.first=b[i];
                    p2.second=b[i+1];
                }
          }
               cout<<p2.first<<","<<p2.second<<" are closest, ";
               cout<< p1.first<<","<<p1.second<<" are most distant."<<endl;
        }
    }
    return 0;
}
void getPrimes(int n)//用欧拉筛法筛出2到根号n里面的素数
{
    memset(judge,false,sizeof judge);
    cnt=0;
    for(int i=2;i<=n;i++)
    {
       if(!judge[i])
        primes[cnt++]=i;
        for(int j=0;j<cnt&&i*primes[j]<=n;j++)
        {
            judge[i*primes[j]]=true;
            if(i%primes[j]==0)
                break;
        }
    }
}

转载于:https://www.cnblogs.com/xiaozou-zone/p/11235403.html

你可能感兴趣的文章
FusionCharts可使用JavaScript渲染iPhone/iPod/iPad图表
查看>>
Leetcode: Rotate List
查看>>
Leetcode: Pascal's Triangle
查看>>
遍历文件夹下的csv,把数据读进一张表
查看>>
图片转成base64 跨域等安全限制及解决方案
查看>>
如何在腾讯云上安装Cloud Foundry
查看>>
linux下操作gpio寄存器的方法
查看>>
[原创]Win7、Win8、Win10始终以管理员身份运行程序。
查看>>
java面试题之有哪几种方式可以让线程阻塞
查看>>
shell脚本语言与linux命令的联系与区别
查看>>
2017.9.12
查看>>
[log]利用logrotate对Linux log进行管理
查看>>
从远程服务器数据库中同步数据到本地数据库 sql server 2008 开启分布式事务
查看>>
Go 面向对象编程应用
查看>>
Go 接口
查看>>
ECMAScript版本
查看>>
js数组
查看>>
开车旅行(2012day1T3)
查看>>
splay
查看>>
动态逆序对[CQOI2011]
查看>>