1007
素数对猜想
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
其实这道题的核心是如何去判断一个数是否是质数,但是用普通的暴力计算方法去判断又会面临超时的问题,因为这道题的问题规模有10的5次方,就是十万。所以要采用可以快速判断质数的算法去进行计算。
我这里采用的是先设定一个十万的布尔数组,大于2的奇数设为真,偶数设为假,因为偶数一定不是质数(除去2),然后再用for (int j = 2; j <= Math.sqrt(i); j++)循环对其进行判定
最后再按照题目的要求把相邻且差为2的质数对统计出来就完事了
具体代码实现如下:
import java.util.Scanner;
public class Main {
static Boolean ZS[]=new Boolean[100001];
public static void main (String[]args)
{
int N;
int number=0;
Scanner input=new Scanner(System.in);
N=input.nextInt();
calZS();
for(int i=0;i<=N;i++)
{
if(ZS[i])
{
for(int j=i+1;j<=N;j++)
{
if(ZS[j])
{
if((j-i)==2)
{
number++;
}
break;
}
}
}
}
System.out.print(number);
}
public static void calZS()
{
ZS[0]=false;
ZS[1]=false;
ZS[2]=true;
for(int i=3;i<100001;i++)
{
if(i%2==0)
{
ZS[i]=false;
}
if(i%2==1)
{
ZS[i]=true;
}
}
for(int i=0;i<100001;i++)
{
if(ZS[i])
{
for (int j = 2; j <= Math.sqrt(i); j++)
{
if (i%j == 0)
{
ZS[i] = false;
break;
}
}
}
}
}
}