Prime Numbers
Compute the number of prime numbers in a given interval. A prime number is an integer p greater than 1 whose only positive divisors are 1 and p. Input The first line contains the number of test cases T (T<=1000). Each test case contains a single line with two numbers separated by a single space: a and b, 2 <= a <= b <= 1000000. Output For each test case output a single line, containing the number of primes between a and b inclusive. Sample input 2 2 7 3 1000000 Sample output 4 78497 |
题目大意:给你一个区间,求出在这个区间内一共有多少个素数。2 <= a <= b <= 1000000
解题思路:
定义一个函数用来打出2-1000000之间的素数,把它放到数组中去,后面再接受区间,根据区间去统计素数表中的素数个数。
void CompositeNumFilterV2(int n,int *flag);
int flag[1000001];
int main()
{
int count;
int left,right;
int NumOfTest;
CompositeNumFilterV2(1000000,flag);
register int i,j;
while (scanf("%d",&NumOfTest)!=EOF)
{
for (j=0;j<NumOfTest;j++)
{
count = 0;
scanf("%d%d",&left,&right);
for (i=left;i<=right;i++)
{
if (flag[i] == 1)
{
count++;
}
}
printf("%d/n",count);
}
}
return 0;
}
void CompositeNumFilterV2(int n,int *flag)
{
int i, j;
/*// 素数数量统计 */
int count = 0;
/* // 分配素数标记空间,明白+1原因了吧,因为浪费了一个flag[0] */
/* //char* flag = (char*)malloc( n+1 ); */
/* // 初始化素数标记,要高效点咯 */
flag[2] = 1;
/* // 注意是i<n不是上例中的i<=n了,理由自思 */
for (i=3; i<n; i++)
{
flag[i++] = 1; /*// 偶数自然不是素数,直接置0好了 */
flag[i] = 0;
}
/* // n为奇数 */
if (n%2 != 0)
{
flag[n] = 1;
}
/*// 从3开始filter,因为2的倍数早在初始化时代就干掉了 */
int k=sqrt(n);
for (i=3; i <= k; i++)
{
/* // i是合数,请歇着吧,因为您的工作早有您的质因子代劳了 */
if (0 == flag[i]) continue;
/* // 从i的2倍开始过滤,变乘法为加法 */
for (j=i; i*j <= n; j++)
{
flag[i*j] = 0;
}
}
/*// 统计素数个数 */
for (i=2; i<=n; i++)
{
if (flag[i]) count++;
}
/*
//因输出费时,且和算法核心相关不大,故略
// 释放内存,别忘了传说中的内存泄漏
//free(flag);
return count;*/