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;

else

x=mid+1;

}

//printf("pri[x]=%d\n",x);

if(pri[x]==v)

return 0;

else

return pri[x]-pri[x-1];

}

int main()

{

int i,j,k=0,n;

for(i=2; i<=1299709; i++)//筛法

if(!a[i])

{

pri[k++]=i;

for(j=i*2; j<=1299709; j+=i)

a[j]=1;

}

while(~scanf("%d",&n),n)

{

printf("%d\n",Serch(n));

}

return 0;

}

时间: 2024-08-01 12:55:40

poj 3518 Prime Gap 二分查找下界和素数筛法的相关文章

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(素数题)

[题意简述]:输入一个数,假设这个数是素数就输出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(素数)

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

二分查找下界 下界

#include<stdio.h> #include<algorithm> using namespace std; int a[10000]; int Serch(int x,int y,int v)//二分查找下界当找不到的时候返回的是第一个大于v的下标,因为当出现a[x]小于v的时候,a[y]大于v的时候,mid=x=(y+x)/2,程序会执行else,所以返回的时候就是y的值,注意越界; { int mid; while(x<y) { mid=(x+y)/2; if(

POJ 3663 Costume Party (二分查找)

Costume Party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12297   Accepted: 4891 Description It's Halloween! Farmer John is taking the cows to a costume party, but unfortunately he only has one costume. The costume fits precisely two

[POJ] 2456 Aggressive cows (二分查找)

题目地址:http://poj.org/problem?id=2456 最大化最小值问题.二分牛之间的间距,然后验证. 1 #include<cstdio> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h> 6 #include<stdbool.h> 7 #include<time.h> 8 #include

POJ 3579 3685(二分-查找第k大的值)

POJ 3579 题意 双重二分搜索:对列数X计算∣Xi – Xj∣组成新数列的中位数 思路 对X排序后,与X_i的差大于mid(也就是某个数大于X_i + mid)的那些数的个数如果小于N / 2的话,说明mid太大了.以此为条件进行第一重二分搜索,第二重二分搜索是对X的搜索,直接用lower_bound实现. #include <iostream> #include <algorithm> #include <cstdio> #include <cmath&g

[POJ] 1064 Cable master (二分查找)

题目地址:http://poj.org/problem?id=1064 有N条绳子,它们的长度分别为Ai,如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长能有多长. 二分绳子长度,然后验证即可.复杂度o(nlogm) 1 #include<cstdio> 2 #include<iostream> 3 #include<string.h> 4 #include<algorithm> 5 #include<math.h> 6 #include

二分查找/暴力 Codeforces Round #166 (Div. 2) B. Prime Matrix

题目传送门 1 /* 2 二分查找/暴力:先埃氏筛选预处理,然后暴力对于每一行每一列的不是素数的二分查找最近的素数,更新最小值 3 */ 4 #include <cstdio> 5 #include <cstring> 6 #include <algorithm> 7 using namespace std; 8 9 const int MAXN = 5e2 + 10; 10 const int MAXM = 1e6 + 10; 11 const int INF = 0