poj 2689 Prime Distance 二次篩素數

來源:互聯網
上載者:User

這個是比較經典的二次篩素數的題目。

給出L,U,求在L~U的區間中 相鄰兩個素數距離最大的和相鄰兩個素數距離最小的

題目中的L,U的範圍是1~2,147,483,647。但是題目中也說了,U-L < 1000000;


解題的思路是,先篩出1~sqrt(2,147,483,647)內的素數,然後用這些素數去篩L~U中的合數。

思路還是很聽簡單的。

有兩點要注意:這個題int可能會越界的,其中有一個 < U的判斷,那個地方會越界,血的教訓那,我在這個地方錯了好久!還有一點是記得處理1哈

#include <iostream>#include <string.h>#include <stdio.h>using namespace std;#define M 47341#define N 2000010int prime[N];bool isPrime[N];int size;int L,D;void getPrime(){    size = 0;    memset(isPrime,1,sizeof(isPrime));    for(int i=2; i < M; i++)    {        if(isPrime[i]) prime[size++] = i;        for(int j=0; j<size && prime[j]*i < M; j++)        {            isPrime[ prime[j]*i ] = 0;            if(i%prime[j] == 0) break;        }    }}int prime2[N];bool isPrime2[N];int size2;void getPrime2(){    size2 = 0;    memset(isPrime2,1,sizeof(isPrime2));    for(int i = 0; i < size && prime[i]*prime[i] <= D; i++)    {        int j = L/prime[i]+(L%prime[i] != 0 );        if(j == 1) j++;        for(; prime[i] <= D/j; j++) // 這兒是會溢出的!!!教訓啊 最後改成了除,要麼把這兒改成long long        {            isPrime2[ j*prime[i]-L ] = 0;        }    }    for(long long i = L; i <= D; i++)        if( isPrime2[i-L] ) prime2[size2++] = i;}int main(){    getPrime();    while(cin >> L >> D)    {        if(L == 1 && D == 2)  {cout << "There are no adjacent primes.\n";continue;}        else if(L == 1) L++;        getPrime2();        int mi = M,ma = -1;        int t,tt;        for(int i = 0; i < size2-1; i++)        {            if(mi > prime2[i+1]-prime2[i])            {                mi = prime2[i+1]-prime2[i];                t = i;            }            if(ma < prime2[i+1]-prime2[i])            {                ma = prime2[i+1]-prime2[i];                tt = i;            }        }        if(size2 <= 1)            cout << "There are no adjacent primes.\n";        else cout << prime2[t] << "," << prime2[t+1] << " are closest, " << prime2[tt] << "," << prime2[tt+1] << " are most distant.\n";    }    return 0;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.