孪生质数

题目:数学中有很多奇特的现象,孪生质数就是一种(孪生素数就是指相差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;
		}
	}

}

猜你喜欢

转载自blog.csdn.net/Broken_Wave/article/details/82112429