【Prime Number】 两种方式

Prime Number

http://www.nowcoder.com/questionTerminal/c5f8688cea8a4a9a88edbd67d1358415

/* 方法一:枚举(不需要重复求子问题,稍有优化)
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> kList;    //需求列表
vector<int> prime;    //maxK个素数
bool isPrime(int n){
    bool flag = true;
    if(n<2)
        flag = false;
    int bound = sqrt(n);
    for(int i=2; i<=bound; i++){
        if(n%i==0)
            flag = false;
    }
    return flag;
}
int main(){
    int k;
    while(cin>>k){
        kList.push_back(k);
    }
    sort(kList.begin(),kList.end());    //找到最大的 k ,避免重复计算子问题
    int maxK = kList[kList.size()-1];
    for(int i=2; prime.size()<=maxK; i++){
        if(isPrime(i)){
            prime.push_back(i);
        }
    }
    for(int r=0;r<kList.size();r++){
        //         第k个素数在prime数组里的index=k-1
        cout<<prime[kList[r]-1]<<endl;
    }
    return 0;
}
*/

/* 方法二:倍数标记法 */
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxN = 10000000;
vector<int> prime;
bool isPrime[maxN];
void init(){
    fill(isPrime,isPrime+maxN,true);    //将isPrime[]初始化为true
    isPrime[0] = false;
    isPrime[1] = false;
    for(int i=2; i<maxN; i++){    //在遍历到i之前,如果没有i的因子把i标记为false,则i一定是prime
        if(isPrime[i]){
            prime.push_back(i);
        }
        for(int j=i*i ; j<maxN; j=j+i){    //i的倍数标记为not prime
            isPrime[j] = false;            //从 i*i 开始,为了减少重复标记的工作量
        }
    }
}
int main(){
    init();
    int k;
    while(cin>>k){
        cout<<prime[k-1]<<endl;
    }
    return 0;
}

全部评论

相关推荐

实习回来快一个月了,海投海笔海测全干了,今天面了两个真的有点心碎,好难啊!&nbsp;感觉现在就是纯碰瓷互联网,焦虑,,,&nbsp;阿里云快给我泡出来!!!
小肥罗:别焦虑,心态不好影响健康,心态放平哦,我可以告诉你,我大三的暑假拿了15份offer,但是我投递了300+企业,整个暑假,我都是边学习,边改简历,边刷题,边投递简历,边应对笔试,面试,一天三家公司的笔试/面试,我一天没睡几个小时,一屁股坐在房间,就像钉在那里一样。。。我也哭过,但是哭完后我也是继续努力才有15份offer的,加油兄弟!不许气馁哈
点赞 评论 收藏
分享
点赞 评论 收藏
分享
码农索隆:邮件那么小的内存,把邮箱都干满了
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务