您的位置:首页 > 编程语言 > Java开发

浙江大学PAT (Basic Level) Practice (中文)1007素数对猜想JAVA实现代码及分析

2019-03-05 20:52 477 查看

1007

素数对猜想

让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数。显然有d​1​​=1,且对于n>1有d​n​​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N(<10​5​​),请计算不超过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;
}
}
}

}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐