题目:数学中有很多奇特的现象,孪生质数就是一种(孪生素数就是指相差2的质数对,例如3和5,5和7,11和13…),现在要求输出所有在m和n范围内的孪生质数。
输入:输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)
例如:100 150
输出
对于每个测试实例,要求输出所有在给定范围内孪生质数,就是说,输出的孪生质数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开 ; 如果给定的范围内不存在孪生指数,则输出 “no” ; 每个测试实例的输出占一行。
样例输出
101 103 107 109 137 139
分析:如果对于每个数都求是否是质数,每个数最优时间复杂度O(√n),这里参考博客描述的埃氏筛法,直接求质数表,然后直接查表判断
import java.util.ArrayList;
import java.util.Scanner;
public class luan_sheng_zhishu {
static int[] prime;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m=in.nextInt();
int n=in.nextInt();
prime =new int[n+1];
init(n);
ArrayList<Integer> al=new ArrayList<Integer>();
for(int i=m;i<n-2;i++) {
if(prime[i]==1&&prime[i+2]==1) {
if(al.size()==0||al.get(al.size()-1)!=prime[i])
al.add(i);
al.add(i+2);
}
}
if(al.size()==0) {
System.out.println("no");
}
else {
StringBuilder sb =new StringBuilder();
for(int num:al) {
sb.append(num+" ");
}
sb.delete(sb.length()-1, sb.length());
System.out.println(sb.toString());
}
}
static void init(int N){
int i,j;
for(i = 2;i <=N ;i++){
prime[i] = 1;
}
for(i = 2;i <= N;i++){
for(j = i+i;j <= N;j += i) prime[j] = 0;
}
}
}