问题描述
小蓝很喜欢科研, 他最近做了一个实验得到了一批实验数据, 一共是两百 万个正整数。
![](https://img-blog.csdnimg.cn/img_convert/0d2b98a30d6745f3a419a13cf6194f6a.png)
![](https://img-blog.csdnimg.cn/img_convert/b47edadd0ebb4105bb8cab6282a76d95.png)
小蓝的所有实验数据都在 primes.txt 中, 现 在他想统计这两百万个正整数中有多少个是质数, 你能告诉他吗?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。
运行限制
最大运行时间:1s
最大运行内存: 512M
源码:
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
public class 小蓝做实验 {
static int N=100000010;
static final int n=(int)1e8;
static boolean[] st=new boolean[N];
static int[] prime=new int[N];
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\Administrator\\Desktop\\primes.txt")));
init();
long ans=0;
while (true){
String s=br.readLine();
if (s==null) break;
long v=Long.parseLong(s);
if (v>n){
if (check(v)) ans++;
}else if (!st[(int) v])
ans++;
}
System.out.println(ans);
}
private static boolean check(long v) {
for (int i = 2; i < v/i; i++) {
if (v%i==0) {
return false;
}
}
return true;
}
//线性筛预处理
static void init() {
for (int i = 2; i <= 1e8; i++) {
if(!st[i]) {
prime[++prime[0]] = i;
}
for (int j = 1; j < prime[0] + 1 && i * prime[j] < 1e8; j++) {
st[i*prime[j]] = true;
if(i % prime[j] == 0) {
break;
}
}
}
}
}