Problem A.质数统计
题目描述
给你一个数字n( n <=30),求比和小的质成的个数:
输入描述
第一行是数据组数T(T<=10)。
接下来T行每行有一个整数n。
输出描述
对于每组输入,输出一个数字表示比它小的质数的个数。
样例输入
3
3
5
8
样例输出
1
2
4
解答:
import java.util.Scanner;
/*
Problem A.质数统计
题目描述
给你一个数字n( n <=30),求比和小的质成的个数:
输入描述
第一行是数据组数T(T<=10)。
接下来T行每行有一个整数n。
输出描述
对于每组输入,输出一个数字表示比它小的质数的个数。
样例输入
3
3
5
8
样例输出
1
2
4
*/
public class Test{
public static void Prim(int[] prim, boolean[] isPrim, int cnt, int num) {//欧拉筛素数
for(int i = 2; i < num; i++) {
if(!isPrim[i]) prim[cnt++] = i;//i未标记,则记录至素数数组中
for(int j = 0; j < cnt && i * prim[j] < num; j++) {
isPrim[i * prim[j]] = true;//标记为访问过
//停止条件,也是欧拉筛的核心
if (i % prim[j] == 0) break;
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
int n = scanner.nextInt();
for(int t = 0; t < n; t++) {
int num = scanner.nextInt();
int[] prim = new int[num];
int cnt = 0;
boolean[] isPrim = new boolean[num];
Prim(prim, isPrim, cnt, num);
int count = 0;
for(int i = 0; i < num; i++) {
if(prim[i] == 0) break;
count++;
}
System.out.println(count);
}
}
}
}