POJ 3518 Prime Gap(素数)

http://poj.org/problem?id=3518

题意:

给你一个数,如果该数是素数就输出0. 否则输出比这个数大的素数与比这个数小的素数的差值。

分析:

明显本题先要用筛选法求出130W(严格的话应该是求第100001个素数)以内的所有素数。

然后判断给的数是否是素数即可。

如果不是素数,那么就找出它在素数素组内的上界和下界,输出两个素数的差值即可。

筛选法求素数可见:

http://blog.csdn.net/u013480600/article/details/41120083

AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1300000;

int prime[maxn+5];
int get_prime()
{
    memset(prime,0,sizeof(prime));
    for(int i=2;i<=maxn;i++)
    {
        if(!prime[i]) prime[++prime[0]]=i;
        for(int j=1;j<=prime[0]&&prime[j]<=maxn/i;j++)
        {
            prime[prime[j]*i]=1;
            if(i%prime[j]==0)break;
        }
    }
    return prime[0];
}

int main()
{
    //生成maxn内的所有素数
    get_prime();

    int x;
    while(scanf("%d",&x)==1 && x)
    {
        int bound=lower_bound(prime+1,prime+prime[0]+1,x)-prime;
        if(prime[bound]==x) printf("0\n");
        else printf("%d\n",prime[bound]-prime[bound-1]);
    }
    return 0;
}
时间: 2024-10-09 08:38:44

POJ 3518 Prime Gap(素数)的相关文章

POJ 3518 Prime Gap(素数题)

[题意简述]:输入一个数,假设这个数是素数就输出0,假设不是素数就输出离它近期的两个素数的差值,叫做Prime Gap. [分析]:这题过得非常险.由于我是打的素数表. 由于最大的素数是1299709,所以注意在打表时要使用long long.否则程序应该不能执行.注意这一点应该就能够了. 积累! // 2984K 235Ms #include<iostream> using namespace std; #define N 2000001 bool isprime[N]; long long

poj 3518 Prime Gap

Prime Gap 1 #include<cmath> 2 #include<cstdio> 3 #include<algorithm> 4 #include<iostream> 5 #include<string> 6 #include<cstring> 7 #include<vector> 8 using namespace std; 9 #define max 100000 10 int prime[max+5];

poj 3518 Prime Gap 二分查找下界和素数筛法

/* 题意:输入有多组数据,每组数据一个n,如果n是素数,输出0否则输出离n最近的两个素数的积,第100000个素数是1299709,所有的素数都在这个范围内 思路:素数筛法加二分查找下界 */ #include<stdio.h> int a[1299720],pri[100005]; int Serch(int v)//二分查找下界 { int mid,x=0,y=100001; while(x<y) { mid=(y+x)/2; if(pri[mid]>=v) y=mid; e

POJ 2689 Prime Distance 素数筛选法应用

题目来源:POJ 2689 Prime Distance 题意:给出一个区间L R 区间内的距离最远和最近的2个素数 并且是相邻的 R-L <= 1000000 但是L和R会很大 思路:一般素数筛选法是拿一个素数 然后它的2倍3倍4倍...都不是 然后这题可以直接从2的L/2倍开始它的L/2+1倍L/2+2倍...都不是素数 首先筛选出一些素数 然后在以这些素数为基础 在L-R上在筛一次因为 R-L <= 1000000 可以左移开一个1百万的数组 #include <cstdio>

POJ 2689 Prime Distance(素数筛选)

题意:输入区间[l,u],其中l和u为int范围的整数,区间最大为1000000.求出[l,u]中,相邻素数只差最大和最小的素数对.当存在多个时,输出较小的素数对. #include <iostream> #include <cstdio> #include <cstring> #define ll long long using namespace std; const int maxm=1e6+10; const int maxn=1e5+100; int prim

POJ 3126 Prime Path(素数路径)

p.MsoNormal { margin-bottom: 10.0000pt; font-family: Tahoma; font-size: 11.0000pt } h1 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 24.0000pt } span.10 { font-family: "Times New Rom

poj 2689 Prime Distance 【数论】【筛法求素数】

题目链接:传送门 题目大意: 给你L和R两组数,L和R的范围是2^32,其间隔(即R-L最大为1,000,000.) .让你求出L和R之间素数的最大间隔和最小的间隔. 比如 2 17.之间的最小素数间隔是2 3,最大的素数间隔是11 17. 要是直接进行一个2^32次方筛法然后在判断是会T的. 我们这样来想,筛法求素数的原理是什么: /**vis数组标记为0则说明是素数*/ int vis[10005]; void getPrimevis(int n) { int m=sqrt(n+0.5);

POJ 1365 Prime Land

Prime Land Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2972 Accepted: 1362 Description Everybody in the Prime Land is using a prime base number system. In this system, each positive integer x is represented as follows: Let {pi}i=0,1,2,

双向广搜 POJ 3126 Prime Path

POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted: 9153 Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change th