SPOJ Problem Set 2. Prime Generator 求某区间质数题解
来源:互联网 发布:淘宝客成交不计入权重 编辑:程序博客网 时间:2024/06/10 04:16
题目大意: 给定两个数,要求产生这两个数之间的所有质数。
两个数位m和n,其范围如下:
The input begins with the number t of test cases in a single line (t<=10). In each of the next t lines there are two numbers m and n (1 <= m <= n <= 1000000000, n-m<=100000) separated by a space.
看似简单的题目,其实也不简单,一般的质数判断方法是,看这个数n能否被2到根号n之间的数除尽,如果不能,那么就是质数,当然,这里这么写程序是会超时的。
查表方法也不行,如果先产生所有的质数表,那么内存太大了,不能保存。一般现在都使用区间剔除的方法。
目前我知道的本题最快的就是二次区间剔除的方法了:
1 先产生2到32000(32000的平方大于1E9)之间的质数,作为一个质数表(增加这个质数表也是为了加速)
2 再产生n到m之间的所有质数
如何产生质数表? 这都是用到往前搜索,剔除不符合条件的数,避免过多的重复计算,带点动态规划的味道。
#include <iostream>#include <vector>#include <string.h>using namespace std;class PrimeNumberGenerator{const static int MAX_NUM = 32000;int PRIMES[MAX_NUM];int segPrimes[100000];public:PrimeNumberGenerator(){memset(PRIMES, 0, sizeof(PRIMES));int j = 0;for (int i = 2; i < MAX_NUM; i++){if (!PRIMES[i]){PRIMES[j++] = i;for (int k = i*2; k < MAX_NUM; k+=i)//不是k++注意{//写成 k = i+1,头痛错误!!!PRIMES[k] = 1;}}}PRIMES[j++] = MAX_NUM;}//本题不需使用的函数bool isPrimeNum(int num){if (2 == num) return true;int i = 0;for ( ; PRIMES[i] * PRIMES[i] <= num && num % PRIMES[i]; i++);return MAX_NUM != PRIMES[i] && num % PRIMES[i] != 0;}void getSegPrimes(int a, int b){memset(segPrimes, 0, sizeof(segPrimes));//每一次都需要memsetfor (int i = 0; PRIMES[i]*PRIMES[i] <= b; i++)//错误写成i <= b-a{int am = a/PRIMES[i];for (int d = am; d * PRIMES[i] <= b; d++){if (d > 1 && d * PRIMES[i] >= a) segPrimes[d*PRIMES[i]-a] = 1;}//这里不能少了判断条件d>1}}void judgePrimes(){int a = 0, b = 0;int T = 0;cin>>T;while (T--){cin>>a>>b;if (a < 2) a = 2;getSegPrimes(a, b);for (int i = a ; i <= b; i++){if (0 == segPrimes[i-a]) cout<<i<<endl;}cout<<endl;}}};int main(){PrimeNumberGenerator pri;pri.judgePrimes();return 0;}
3 0
- SPOJ Problem Set 2. Prime Generator 求某区间质数题解
- SPOJ 2. Prime Generator
- 求大区间质数个数
- SPOJ 02 Prime Generator
- SPOJ PRIME1 - Prime Generator【Miller_Rabin
- 【SPOJ-PRIME1】Prime Generator【区间质数筛】
- HDU 1016 Prime Ring Problem 题解
- Problem 49 Prime permutations (set + vector)
- Prime Generator
- SPOJ Problem Set (classical) 11582. A Famous Grid
- ZOJ-1457 prime ring problem 素数环 题解
- hdoj1016 Prime Ring Problem (入门回溯) 题解
- ZOJ Problem Set - 1314 Uniform Generator(GCD)
- Problem 4 求回文数
- Problem 41 Pandigital prime (暴力set+vector)
- ZOJ Problem Set - 1095 丑数
- G-Prime Generator|埃式筛法
- spoj2 Prime Generator
- db2中decimal的使用需要注意的事項
- 《算法导论》笔记 第10章 10.2 链表
- Trie树
- qt入门之窗口居中,没大小化按钮
- MySQL(基础篇)之触发器
- SPOJ Problem Set 2. Prime Generator 求某区间质数题解
- C++ - 显示接口&运行期多态 和 隐式接口&编译期多态
- LAMP配置详解
- zoj 3780 Paint the Grid Again
- RouterOS 自动拨号直至获得指定IP段IP的脚本
- The Singleton Pattern 单例模式
- android软引用和弱引用
- 什么叫事务
- java集合基础知识点总结