给出一系列的数,统计素数的个数
思路:因为数据的范围为2^31-1,先计算出[2,sqrt(2^31-1]之间的素数primes。在判断给出的数num是否是素数时,只需要判断num是否能被primes集合中的数据整除
代码如下:
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.IOException;
import java.io.StreamTokenizer;
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
public class Main implements Runnable{
private Scanner cin;
private PrintWriter cout;
private static final boolean DEBUG = false;
private static final int N = 46340;
private List<Integer> primes = new ArrayList<>();
private List<Integer> nums = new ArrayList<>();
private boolean[] vis = new boolean[N];
private void preprocess()
{
for (int i = 2; i < N; i++)
{
if (!vis[i])
{
primes.add(i);
}
int size = primes.size();
for (int j = 0; j < size && primes.get(j) * i < N; j++)
{
vis[primes.get(j) * i] = true;
if (i % primes.get(j) == 0) break;
}
}
}
private void init()
{
try
{
if (DEBUG)
{
cin = new Scanner(new BufferedReader(new InputStreamReader(new FileInputStream("e:\\program\\idea\\spoj\\spoj.txt"))));
}
else
{
cin = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
}
preprocess();
cout = new PrintWriter(System.out);
}
catch (IOException e)
{
e.printStackTrace();;
}
}
private boolean input()
{
if (!cin.hasNextInt()) return false;
int n = cin.nextInt();
nums.clear();
for (int i = 0; i < n; i++)
{
int num = cin.nextInt();
nums.add(num);
}
return true;
}
private void solve()
{
int ans = 0;
for (int i = 0; i < nums.size(); i++)
{
boolean isPrime = true;
for (int j = 0; j < primes.size() && nums.get(i) > primes.get(j); j++)
{
if (nums.get(i) % primes.get(j) == 0) {
isPrime = false;
break;
}
}
if (isPrime) ans++;
}
cout.println(ans);
cout.flush();
}
public void run() {
init();
while (input())
{
solve();
}
}
public static void main(String[] args)
{
new Thread(new Main()).start();
}
}