题意:求[m,n]之间的素数,其中1 <= m <= n <= 1000000000, n-m<=100000
思路:用分段筛选法,先求出[1,sqrt(n)]之间的素数,然后删除[m,n]中能被[1,sqrt(n)]区间素数的整数倍的数据
代码如下:
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.List;
import java.util.ArrayList;
public class Main{
private StreamTokenizer cin;
private PrintWriter cout;
private static final boolean DEBUG = false;
private int m, n;
private boolean[] vis;
private void init()
{
try
{
if (DEBUG)
{
cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(new FileInputStream("e:\\program\\idea\\spoj\\spoj.txt"))));
}
else
{
cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
}
cout = new PrintWriter(System.out);
}
catch (IOException e)
{
e.printStackTrace();;
}
}
private Integer nextInt()
{
try
{
cin.nextToken();
if (cin.ttype == StreamTokenizer.TT_EOF) return null;
else if (cin.ttype == StreamTokenizer.TT_NUMBER) return (int)(cin.nval);
else return null;
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
private void input()
{
m = nextInt();
n = nextInt();
}
private void solve(int t)
{
int delta = (int)Math.sqrt(n);
vis = new boolean[delta + 1];
List<Integer> primes = new ArrayList<>();
for (int i = 2; i <= delta; i++)
{
if (!vis[i])
{
primes.add(i);
}
int size = primes.size();
for (int j = 0; j < size && i * primes.get(j) <= delta; j++)
{
vis[i * primes.get(j)] = true;
if (i % primes.get(j) == 0) break;
}
}
if (m < 2) m = 2;
vis = new boolean[n - m + 1];
int size = primes.size();
for (int i = 0; i < size; i++)
{
int start = primes.get(i);
if (m % primes.get(i) == 0)
{
start = Math.max(start, m / primes.get(i));
}
else
{
start = Math.max(start, m / primes.get(i) + 1);
}
int cur = primes.get(i);
for (int j = start * cur; j <= n; j += cur)
{
vis[j - m] = true;
}
}
for (int i = 0; i < vis.length; i++)
{
if (!vis[i])
{
cout.println(m + i);
}
}
if (t != 0) cout.println();
cout.flush();
}
public void run() {
init();
int t = nextInt();
while (t-- > 0) {
input();
solve(t);
}
}
public static void main(String[] args)
{
new Main().run();
}
}