筛选法求素数表,并标记素数位置和合数最大质数位置 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.
将上面的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;
}
素数筛选法可以标记出素数和非素数
素数筛选法:
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;
}
相关文章推荐
- HDU_2136——最大质因数,素数筛选法
- 编程之美之质数相关--二分图最大匹配+素数筛选
- 素数检测-Miller_Rabin算法-hoj1356-nod1186质数检测V2
- 题目1011:最大连续子序列(需要标记边界位置)
- ny520 最大素因子 筛选法求素数
- hdu 2136(最大素数因子)
- hdu 2136 (Largest prime factor)就是简单 的筛选素数法
- 欧拉计划之题目3:找出一个合数的最大质数因子。
- 快速幂取模&&素数筛选&&最大公约数
- hdu 2136 数论+筛选质数+打表
- 欧拉计划---0003 Largest prime factor(找出一个合数的最大质数因子)
- [ACM Steps] 2.1.4 最大素数因子的位置
- 素数筛选和合数分解
- 分解质因数: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数
- 素数(质数)与合数的研究
- HDU 2136 素数打表+求质数因子
- 素数/质数/合数的定义
- CodeForces 154B——Colliders——筛选素数,模拟标记
- 定义:整除、素数与合数、公约数和最大公约数、互素(既约)、公倍数和最小公倍数以及同余
- 欧拉工程第3题 找出一个合数的最大质数因子