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

探讨素数对猜想,即是否存在无限多对相邻且差为2的素数。介绍一种算法,通过预处理和筛选,快速判断质数并统计满足猜想的素数对数量,适用于大规模数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
		           }
			   }
		   }
		 
	   } 
   }
  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值