poj3006 筛选法求素数模板(数论)
2013-12-09 21:43
232 查看
POJ:3006
很显然这是一题有关于素数的题目。
注意数据的范围,爆搜超时无误。
这里要用到筛选法求素数。
筛选法求素数的大概思路是:
如果a这个数是一个质数,则n*a不是质数。
用一个数组实现就是:
memset(prime,true,sizeof(prime));
if (prime[i]) prime[i*j]=false;
部分程序如下:(朴素)
之后将中间进行小小的优化:
我们知道偶数中,除了2,其他的都是合数。
所以就可以将i++ 和 j++改成i+=2,j+=2;
再将除2以外的偶数判为false;以及注意一下特殊的值: 1和0是false;(要记住,c++的数组是从0~max的,所以0要考虑在内)
优化后的程序如下:
这样,这题就可以在我们拟好的素数表中找到第n个要求的素数。用一个简单的循环就可以搞定。
很显然这是一题有关于素数的题目。
注意数据的范围,爆搜超时无误。
这里要用到筛选法求素数。
筛选法求素数的大概思路是:
如果a这个数是一个质数,则n*a不是质数。
用一个数组实现就是:
memset(prime,true,sizeof(prime));
if (prime[i]) prime[i*j]=false;
部分程序如下:(朴素)
const max=1000005; bool prime[1000005]; memset(prime,true,sizeof(prime)); for(i = 3 ; i <= ::max ; i ++ ) { for(j = 3 ; j <= ::max/i ; j ++) { if(prime[i]) { prime[i * j] = false; } } }
之后将中间进行小小的优化:
我们知道偶数中,除了2,其他的都是合数。
所以就可以将i++ 和 j++改成i+=2,j+=2;
再将除2以外的偶数判为false;以及注意一下特殊的值: 1和0是false;(要记住,c++的数组是从0~max的,所以0要考虑在内)
优化后的程序如下:
const int max = 1000005; bool prime[1000005]={false}; memset(prime,true,sizeof(prime)); for(i = 3 ; i <= 1000 ; i += 2 ) { for(j = 3 ; j <= ::max / i ; j += 2) { if(prime[i]) { prime[i * j] = false; } } } for(i = 4 ; i <= ::max; i += 2 ) { prime[i] = false; } prime[1] = prime[0] = false;
这样,这题就可以在我们拟好的素数表中找到第n个要求的素数。用一个简单的循环就可以搞定。
附上完整模板:
#include<iostream> #include<cstring> using namespace std; const int max = 1000005; bool prime[1000005]={false}; int main() { int i,a,d,n,j; memset(prime,true,sizeof(prime)); for(i = 3 ; i <= 1000 ; i += 2 ) { for(j = 3 ; j <= ::max / i ; j += 2) { if(prime[i]) { prime[i * j] = false; } } } for(i = 4 ; i <= ::max; i += 2 ) { prime[i] = false; } prime[1] = prime[0] = false; while(cin >> a >> d >> n,a != 0 && d != 0 && n != 0) { j = 0; for (i = a; j < n; i += d) { if (prime[i]) { j++; } } cout << i - d << endl; } return 0; }
相关文章推荐
- 邝斌的ACM模板(素数筛选和合数分解)
- 素数筛选【模板】
- 素数筛选(模板)
- 素数筛选模板
- 数论之 素因子分解,素数筛选法,欧拉函数和扩展欧几里得算法 (整理)
- 王烯出的题:数论(素数筛选)
- 数论——素数筛选法与整数的素因子分解
- 2017 Multi-University Training Contest - Team 4 :Counting Divisors(数论:素数筛选+分解质因子+求因子数)
- 素数筛选优化模板
- 素数筛选法 模板
- 素数筛选模板
- hdu1695 综合数论 欧拉函数 分解质因子 容斥原理 打印素数表 各种模板
- 数论--素数筛选法与整数的素因子分解
- 素数筛选模板
- 筛选法求素数模板
- 素数表的快速建立,合数分解,1-2^31内某个长度小于10w的区间素数筛选的三个模板及解析
- 快速线性素数筛选[模板]
- HDU2303(数论)大整数求余+素数筛选
- 筛选素数模板
- HDU2303(数论)大整数求余+素数筛选