Description | ||
给定两个非负整数a,b,其中0<= a,b<=1,000,000,请计算这两个数之间有多少个素数。 输入 第一行是一个整数K(1<=K<=1000),表示有多少个样例,每个样例占一行,是两个整数a和b,每个整数之间用一个空格隔开。 输出 每行输出一个样例的结果。 | ||
Sample Input | ||
2 2 3 17 19 | ||
Sample Output | ||
2 2 |
思路分析:这道题的难点就是打表打表打表!具体原理就是2如果是素数,那么4,6,8就一定不是素数,a是素数,2a,3a,4a就不是素数
#include <stdio.h>
#include <iostream>
using namespace::std;
int arr[1000050] = {0};
int main()
{//打表。如果说2是素数,那么4,6,8一定不是素数
//如果3是素数,那么6,9,12一定不是素数
//因此我们要判断某个数我们是否储存过
arr[0] = 1;
arr[1] = 1;//1表示非素数,0表示素数
for (int i = 2; i <= 1000000; i++) {
if (arr[i] == 0) {
for (int j = 2 * i; j <= 1000000; j += i) {
arr[j] = 1;
}
}
else break;
}//打表,标记所有的素数,用数组下标来当作数字本身,数组下标对应的数字为素数,那么
int n;
scanf("%d", &n);
while (n--) {
int a, b, count = 0;
scanf("%d %d", &a,&b);
if (a > b) swap(a, b);
for (int i = a; i <= b; i++) {
if (arr[i] == 0)
count++;
}
printf("%d\n", count);
}
}