您的位置:首页 > 其它

51nod 1181 质数中的质数(质数筛法)

2016-09-16 20:26 162 查看
51nod 1181 质数中的质数(质数筛法)

非线性

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define E 2.71828
#define MOD 100000000
#define N 1001000

int prime
;
void is_prime()
{
memset(prime,0,sizeof(prime));
for(int i = 2; i <= N/2; i++)
{
if(prime[i] == 0)
{
for(int j = i+i; j < N; j += i)
prime[j] = 1;
}
}
}
int main()
{
int n;
is_prime();
scanf("%d",&n);
int cnt = 0;
for(int i = 2; ; i++)
{
if(prime[i] == 0)
{
cnt++;
if(i >= n && prime[cnt] == 0)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}


这种方法会造成重复筛除合数,影响效率。

快速线性筛法

利用了每个合数必有一个最小素因子。每个合数仅被它的最小素因子筛去正好一次。所以为线性时间。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define E 2.71828
#define MOD 100000000
#define N 1001000

int id
;
int prime
;

void is_prime()
{
int k = 0;
memset(prime,0,sizeof(prime));
for(int i = 2; i < N; i++)
{
if(prime[i] == 0)
id[k++] = i;
for(int j = 0; j < k && id[j] * i < N; j++)
{
prime[i * id[j]] = 1;
if(i % id[j] == 0)
break;
}
}
}
int main()
{
int n;
is_prime();
scanf("%d",&n);
int cnt = 0;
for(int i = 2; ; i++)
{
if(prime[i] == 0)
{
cnt++;
if(i >= n && prime[cnt] == 0)
{
printf("%d\n",i);
break;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: