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 prime[100001],nprime;  // 注意long long

void doprime()
{
    long long i,j;  // !!注意
    nprime = 1;
    memset(isprime,true,sizeof(isprime));
    isprime[1] = 0;
    for(i = 2;i<=1299709;i++)
    {
        if(isprime[i])
        {
            prime[nprime++] = i;
            for(j = i*i;j<=1299709;j+=i)
            {
                isprime[j] = false;
            }
        }
    }
}

int main()
{
	long long n;//注意。
	doprime();
	while(1)
	{
		cin>>n;
		if(n == 0)
			break;

		for(long long i = 0;i<nprime;i++)
		{
			if(n == prime[i]){
				cout<<0<<endl;
				break;
			}

			if(n>prime[i]&&n<prime[i+1]){
				cout<<prime[i+1]-prime[i]<<endl;
				break;
			}
		}
	}
	return 0;
} 
时间: 2024-10-01 07:53:58

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

POJ 3518 Prime Gap(素数)

http://poj.org/problem?id=3518 题意: 给你一个数,如果该数是素数就输出0. 否则输出比这个数大的素数与比这个数小的素数的差值. 分析: 明显本题先要用筛选法求出130W(严格的话应该是求第100001个素数)以内的所有素数. 然后判断给的数是否是素数即可. 如果不是素数,那么就找出它在素数素组内的上界和下界,输出两个素数的差值即可. 筛选法求素数可见: http://blog.csdn.net/u013480600/article/details/41120083

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>

UVa 1644 Prime Gap (水题,暴力)

题意:给定一个数 n,求它后一个素数和前一个素数差. 析:先打表,再二分查找. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring&

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

【UVA - 1644】Prime Gap(水题)

Prime Gap 这里直接写中文了 Descriptions: 对于一个数n,若n为素数则输出0,否则找到距离n最小的两个素数,一个大于n,一个小于n,输出他们的差(正数) Input 多组输入 每行包含一个数n 若n为0,程序结束 Output 对于每个测试数据,输出一个答案占一行 Sample Input 10 11 27 2 492170 0 Sample Output 4 0 6 0 114 题目链接: https://vjudge.net/problem/UVA-1644 水题,先求

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);