LA-3883 & POJ-3518 Prime Gap 解题报告

这篇博客详细介绍了如何解决LA-3883和POJ-3518两道关于素数间隔的ACM算法题。作者采用了离线处理的方法,先筛选出给定范围内的素数,然后计算每个数到其相邻素数的差值,当输入数本身就是素数时返回0。通过构建素数表,实现了快速查询和高效计算。
摘要由CSDN通过智能技术生成

       筛素数的水题。题意:给一个整数n,求n一个素数和一个素数的差值,如果n是素数时输出0。


       我的解题思路:数据范围不太大,不过为了保险起见还是要离线处理。筛出范围内的素数表,然后就可以一次性算出所有数的答案,保存起来,这样查询速度会很快。


       我的解题代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>

using namespace std;

const int N = 1299710;

int isprime[N];     //存储答案,素数则为0,非素数则为答案,0和1特殊
int primes[N], pn;
int n;

void InitRead();

void DataProcess();

void FastSieve(int maxn);

int main()
{
    InitRead();
    while (~scanf("%d", &n))
    {
        if (n == 0) break;
        DataProcess();
    }
    stack<int> s;
    return 0;
}

void InitRead()
{
    memset(isprime, 0, sizeof(isprime));
    isprime[0] = isprime[1] = -1;
    pn = 0;
    FastSieve(N-1);
    for (int i=1; i<pn; ++i)
    {
        for (int j=primes[i-1]+1; j<primes[i]; ++j)
        {
            isprime[j] = primes[i] - primes[i-1];
        }
    }
    return;
}

void DataProcess()
{
    printf("%d\n", isprime[n]);
    return;
}

void FastSieve(int maxn)
{
    for (int i=2; i<=maxn; ++i)
    {
        if (isprime[i] == 0) primes[pn++] = i;
        for (int j=0; j<pn; ++j)
        {
            if (i * primes[j] > maxn) break;
            isprime[i * primes[j]] = 1;
            if (i % primes[j] == 0) break;
        }
    }
    return;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值