POJ 3518 Prime Gap【二分答案】

题目

二分答案要求被分的是排序后的。不断接近答案,判断是否符合条件,这里的条件是p[mid]和n接近n

拿它当二分答案入门...虽然被坑了好长时间(就是素数筛选法,用i*i<=NMAX半就停止会WA)

求指定数左右两边的第一个素数之差

#define NMAX 1299800
#include <stdio.h>
#include <math.h>
#include <string.h>
int p[NMAX];
char prime[NMAX];
int n,index;
int l,r;
int ans;
void getPrime(){
    int i,j;
    memset(prime,0,sizeof(prime));
    index = 0;
    prime[0] = prime[1] = 1;
    for(i=2;i<=NMAX;i++){   //这里千万不能是i*i<=NMAX
        if(!prime[i]){
            p[index++] = i;
            for(j=2*i;j<=NMAX;j+=i)
                prime[j] = 1;
        }
    }
}
void Bound_search()
{
    int mid;
    while(l < r)
    {
        mid = (l + r)/2;
        if(p[mid] > n)  r = mid;
        else  l = mid + 1,ans = mid;
    }
}
int main()
{
    int i; //freopen("in.txt","r",stdin);
    getPrime();
    while(scanf("%d",&n)!=EOF,n)
    {
        if(!prime[n])
            printf("0\n");
        else{
                l = 0;
                r = index;
                Bound_search();
                printf("%d\n",p[ans+1]-p[ans]);
            }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值