POJ-2689-プライムの距離(プライム間隔ふるいです)

リンク:

https://vjudge.net/problem/POJ-2689

質問の意味:

数論と呼ばれる数学の枝は、数字の性質についてです。何千年もの数の理論家の関心を獲得している分野の一つは、素数の問題です。素数には、適切な因子(それだけで割り切れる1自体によるものである)を有していない数です。最初の素数は2,3,5,7-ですが、彼らはすぐにあまり頻繁になります。興味深い問題の一つは、彼らが様々な範囲にあるか密です。隣接する素数は、両方の素数ある二つの数字ですが、隣接する素数の間には、他の素数はありません。例えば、2,3は、隣接する数字だけ隣接素数です。
すなわち(LとU(1 <= L <U <= 2147483647)、あなたが最も近い2つの隣接する素数C1とC2(L <= C1 <C2 <= U)を見つけるためにある:あなたのプログラムは、2つの数字を与えていますC2-C1)が最小となります。離れて同じ距離にある他の対が存在する場合、最初のペアを使用します。もしD1およびD2は、可能な限り互いにとして離れているD1及びD2(L <= D1 <D2 <= U)は(タイが存在する場合、再び最初のペアを選択すること)は、2つの隣接する素数を見つけることもあります。

アイデア:

することができ、再び素数横切り、その後、プライム間隔ふるいを考えてみましょう。

コード:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<math.h>
#include<vector>

using namespace std;
typedef long long LL;
const int INF = 1e9;

const int MAXN = 1e6+10;
LL l, r;

int Isprime[MAXN];
int Prime[MAXN];
int Islarge[MAXN];
int cnt;

void Euler()
{
    memset(Isprime, 0, sizeof(Isprime));
    memset(Islarge, 0, sizeof(Islarge));
    cnt = 0;
    int n = sqrt(r);
    for (int i = 2;i <= n;i++)
    {
        if (Isprime[i] == 0)
            Prime[++cnt] = i;
        for (int j = i;j <= n/i;j++)
            Isprime[j*i] = 1;
    }
    for (int i = 1;i <= cnt;i++)
    {
        int s = l/Prime[i];
        int e = r/Prime[i];
        for (int j = max(s, 2);j <= e;j++)
        {
            Islarge[1LL*Prime[i]*j-l] = 1;
        }
    }
}

int main()
{
    while(~scanf("%lld%lld", &l, &r))
    {
        Euler();
        /*
        for (int i = 1;i <= cnt;i++)
            cout << Prime[i] << ' ';
        cout << endl;
        */
        vector<int> p;
        if (l == 1)
            Islarge[0] = 1;
        for (int i = 0;i <= r-l;i++)
        {
            if (Islarge[i] == 0)
                p.push_back(i);
        }
        if (p.size() < 2)
            puts("There are no adjacent primes.");
        else
        {
            int mmax = 0, mmin = INF;
            int mal, mar, mil, mir;
            for (int i = 1;i < (int)p.size();i++)
            {
                if (p[i]-p[i-1] > mmax)
                {
                    mmax = p[i]-p[i-1];
                    mal = p[i-1];
                    mar = p[i];
                }
                if (p[i]-p[i-1] < mmin)
                {
                    mmin = p[i]-p[i-1];
                    mil = p[i-1];
                    mir = p[i];
                }
            }
            mil += l, mir += l, mal += l, mar += l;
            printf("%d,%d are closest, %d,%d are most distant.\n", mil, mir, mal, mar);
        }
    }

    return 0;
}

おすすめ

転載: www.cnblogs.com/YDDDD/p/11789662.html