poj3006 Dirichlet's Theorem on Arithmetic Progressions 歐拉篩法素數打表,雜題

題目鏈接:http://poj.org/problem?id=3006

題目大意:設一個等差數列,首元素爲a,公差爲b
                    現在要求輸入a,b,n ,要求找出屬於該等差數列中的第n個素數並輸出

思路:先打表把素數打出來,然後就是一道水題了

///2014.7.16
///poj3006

//Accepted  1516K   63MS    C++ 1333B   2014-07-16 21:54:14

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;

/*===================================================*\
  歐拉篩法 素數打表,該函數執行後
  prim[]數組中存入[2,N]區間內的所有素數(從prim[0]開始存入)
  isPrime[i] 表示整數 i 是否爲素數
  函數返回[2,N]之間的素數的個數
\*===================================================*/
const int N = 1000000;
bool isPrime[N+10];
int prim[80000]; //要注意保證pirm[]數組足夠存儲[2,N]之間的素數
int prime(){
    int num = 0;
    memset(isPrime,true,sizeof(isPrime));
    isPrime[0] = isPrime[1] = false;
    for(int i=2 ; i<=N ; i++){
        if( isPrime[i] ) prim[num++] = i;
        for(int j=0 ; j<num ; j++){
            if( i*prim[j]>N ) break;
            isPrime[ i*prim[j] ] = false;
            if( i%prim[j] == 0 ) break;
        }
    }
    return num;
}

int a,d,n;

int main(){
    // freopen("in","r",stdin);
    // freopen("out","w",stdout);
    
    prime();
    while( scanf("%d %d %d",&a,&d,&n) && !(!a&&!d&&!n) ){
        int i;
        for(i=0 ; i<n ; ){
            if( isPrime[a] ){
                i++;
                a += d;
                continue;
            }
            else{
                while( !isPrime[a] )
                    a += d;
            }
        }
        cout<<a-d<<endl;
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章