素数密度
题目描述
给定 L , R L,R L,R,请计算区间 [ L , R ] [L,R] [L,R] 中素数的个数。
1 ≤ L ≤ R < 2 31 1\leq L\leq R < 2^{31} 1≤L≤R<231, R − L ≤ 1 0 6 R-L\leq 10^6 R−L≤106。
输入格式
第一行,两个正整数 L L L 和 R R R。
输出格式
一行,一个整数,表示区间中素数的个数。
样例 #1
样例输入 #1
2 11
样例输出 #1
5
问题链接: P1835 素数密度
问题分析: 素数问题,不解释。
参考链接: (略)
题记: (略)
AC的C语言程序如下:
/* P1835 素数密度 */
#include <stdio.h>
#include <string.h>
#include <math.h>
// 欧拉筛法
#define N 50000
char isprime[N + 1];
int prime[N / 3], pcnt = 0;
void eulersieve(void)
{
memset(isprime, 1, sizeof isprime);
isprime[0] = isprime[1] = 0;
for(int i = 2; i <= N; i++) {
if(isprime[i])
prime[pcnt++] = i;
for(int j = 0; j < pcnt && i * prime[j] <= N; j++) { //筛选
isprime[i * prime[j]] = 0;
if(i % prime[j] == 0) break;
}
}
}
int main()
{
eulersieve();
int l, r, cnt = 0;
scanf("%d%d", &l, &r);
if (l <= 2) l = 2;
for (int i = l; i <= r; i++) {
int p = sqrt(i);
int f = 1;
for (int j = 0; prime[j] <= p; j++)
if (i % prime[j] == 0) {
f = 0;
break;
}
if (f) cnt++;
}
printf("%d", cnt);
return 0;
}