孪生素数(用筛法求素数)
所谓孪生素数指的就是间隔为 2 的相邻素数,它们之间的距离已经近得不能再近了,
就象孪生兄弟一样。最小的孪生素数是 (3, 5),
在 100 以内的孪生素数还有 (5, 7), (11, 13), (17, 19), (29, 31),
(41, 43), (59, 61) 和 (71, 73),总计有 8 组。
但是随着数字的增大,孪生素数的分布变得越来越稀疏,寻找孪生素数也变得越来越困难。
那么会不会在超过某个界限之后就再也不存在孪生素数了呢?
孪生素数有无穷多对!这个猜想被称为孪生素数猜想,至今没有被严格证明。
但借助于计算机我们确实可以找到任意大数范围内的所有孪生素数对。
下面的代码求出了正整数n以内(不含n)的所有孪生素数对的个数。
比如,当n=100的时候,该方法返回8。
问题关键:
用筛法求出1-n之间的所有素数
用arr[]数组保存当前下标所代表的数字是否为素数,true为素数,false为非素数
for(int i=2;i<arr.length;i++){
for(int j=2;i*j<arr.length;j++){
arr[i*j]=false;
}
双重循环,即可算出1-n所有的素数,而且时间复杂度也较小
import java.util.Scanner;
public class 孪生素数 {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int count=0;
int n=input.nextInt();
boolean[] arr=new boolean[n+1];
for(int i=1;i<arr.length;i++){
arr[i]=true;
}
arr[0]=false;
arr[1]=false;
for(int i=2;i<arr.length;i++){
for(int j=2;i*j<arr.length;j++){
arr[i*j]=false;
}
}
for(int i=2;i<arr.length;i++){
if(arr[i]==true&&arr[i-2]==true){
System.out.println((i-2)+","+i);
count++;
}
}
System.out.println(count);
}
}