Count prime hoj 区间求素数个数(大范围)
2012-08-21 20:25
344 查看
/*区间筛素数 简述:有的时候,我们需要知道某个特定区间的素数(区间大小较小,但数可能很大)。 那么数组就开不下,这时候我们仍然可以使用筛法,只是所有的下标都进行了偏移。 大家理解下面这段代码可以先用普通筛法写,然后数组下标集体移动即可。*/ #include <stdio.h> #include <cmath> #include <cstring> const int maxn = 1000001; int PrimeList[maxn]; int PrimeNum; bool IsNotPrime[maxn]; // IsNotPrime[i] = 1表示i + L这个数是素数. void SegmentPrime(int L, int U) { // 求区间[L, U]中的素数. int i, j; int SU = sqrt(1.0 * U); int d = U - L + 1; for (i = 0; i < d; i++) IsNotPrime[i] = 0; // 一开始全是素数. for (i = (L % 2 != 0); i < d; i += 2) IsNotPrime[i] = 1; // 把偶数的直接去掉. for (i = 3; i <= SU; i += 2) { if (i > L && IsNotPrime[i - L]) continue; // IsNotPrime[i - L] == 1说明i不是素数. j = (L / i) * i; // j为i的倍数,且最接近L的数. if (j < L) j += i; if (j == i) j += i; // i为素数,j = i说明j也是素数,所以直接 + i. j = j - L; for (; j < d; j += i) IsNotPrime[j] = 1; // 说明j不是素数(IsNotPrime[j - L] = 1). } if (L <= 1) IsNotPrime[1 - L] = 1; if (L <= 2) IsNotPrime[2 - L] = 0; PrimeNum = 0; for (i = 0; i < d; i++) if (!IsNotPrime[i]) PrimeList[PrimeNum++] = i + L; } int main() { int l,r; while(scanf("%d%d",&l,&r)==2) { SegmentPrime(l,r); printf("%d\n",PrimeNum); } return 0; }
相关文章推荐
- [数论] HOJ 2276 Count prime 筛素数
- poj 2689 Prime Distance 筛法+区间筛素数
- Python实现输出某区间范围内全部素数的方法
- [数论] HOJ 1015 Nearly prime numbers 筛素数
- POJ2689——Prime Distance(大区间素数筛)
- [ACM] POJ 2689 Prime Distance (筛选范围大素数)
- POJ - 2689 Prime Distance(大区间素数筛选)
- POJ - 2689 - Prime Distance - (区间大数筛素数)
- POJ2689:Prime Distance(大数区间素数筛)
- [ACM] POJ 2689 Prime Distance (大区间素数筛选)
- POJ 2689 Prime Distance(区间相邻素数最大、小距离,区间素数筛)
- LightOJ 1197(大数范围筛区间内素数个数)
- 容斥求范围内互质的个数 (njustoj 1922 count_prime)
- HDU 5901 Count primes (区间素数个数)
- POJ_2689_Prime Distance(区间素数)
- poj 2689 Prime Distance(大区间素数)
- Poj 2689 Prime Distance ----大区间素数筛选
- POJ 2689 Prime Distance (素数筛选法,大区间筛选)
- Prime Distance poj 2689 区间内的素数打表模板
- POJ 2689 Prime Distance(素数区间筛法--经典题)