FOJ 1563 Prime Numbers

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之间的素数,把它放到数组中去,后面再接受区间,根据区间去统计素数表中的素数个数。

 

 

#include <stdio.h> #include <stdlib.h> #include <math.h> 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;*/

你可能感兴趣的:(FOJ 1563 Prime Numbers)