您的位置:首页 > 其它

筛选法求素数表,并标记素数位置和合数最大质数位置 HOJ 2136

2017-02-13 17:56 295 查看
参考文章  http://www.cnblogs.com/Su-Blog/archive/2012/08/24/2654759.html

素数筛选法可以标记出素数和非素数

素数筛选法:

1.

const int size=10000000;
int a[size+5];

int main()
{
int m=int(sqrt(size+0.5));
for(int i=2;i<=m;i++) //到sqrt(N) ,下面就从i*i开始
{
if(a[i]==1) continue;
for(int j=i*i;j<=size;j+=i)
{
a[j]=1;
}
}
return 0;
}


2.
int main()
{
for(int i=2;i<=size;i++)  //到N ,下面就从i*2开始
{
if(a[i]==1) continue;
for(int j=i*2;j<=size;j+=i)
{
a[j]=1;
}
}
return 0;
}
第二个比第一个慢一倍不到,不过都比较快。

将上面的a[j]=1该为a[j]=k (k记录当前已经有的质数数量)就可以标记当前的质数(如果是的话)在质数表中的位置下标。

题目地址:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=2§ionid=1&problemid=5

#include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
#include <sstream>

using namespace std;
const int size=1000000;

int lpf[size+1];

int main()
{
int k=1;//k初始化为1,位置
memset(lpf,0,sizeof(lpf));
for(int i=2;i<=size;i++)//要到N,而不是sqrt(N)
{
if(lpf[i]!=0) continue;
lpf[i]=k;//素数i的位置
for(int j=i+i;j<size;j+=i)
{
lpf[j]=k;//构造出j的暂时最大素数因子的位置
}
k++;
}
int n;
while(scanf("%d",&n)==1)
{
printf("%d\n",lpf
);
}
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: