PAT乙级1007题目详解

1007 素数对猜想 (20分)

让我们定义dn

为:dn

=pn+1

pn

,其中pi

是第i个素数。显然有d1

=1,且对于n>1有dn

是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N(<105

),请计算不超过N的满足猜想的素数对的个数。

输入格式:

输入在一行给出正整数N

输出格式:

在一行中输出不超过N的满足猜想的素数对的个数。

输入样例:

20
   

输出样例:

4

题目解析:
素数:2,3,5,7,11,13,17,19,23,……(不包括1)

测试点0-4输入都是介于2-31之间的数,最后一个测试点是比较大的一个数

我的方法就是,把N之内的所有素数找到,然后存放到数组中,然后在数组中寻找相邻的相差为2的素数的个数。

此题目的核心算法就是质数的判断:

质数:除了1和它本身,没有其它的数可以被其整除。所以判断是否质数的方法就是用这个数/2 /3 /4 …… 一直除到N-1,如果都没有整除的数那么这个数就是质数。但一般数较大的话判断起来比较耗时,所以一般判断到sqrt(N)就可以了。下面我给大家写一下素数的判断方法,需要牢牢掌握,会经常用到。


//判断N是不是质数的算法
/*后续还会有更厉害的判断素数的办法,大家目前可以先掌握这个,如果学
有余力的话还是建议大家看一下的,那个方法的优点就是判断速度更快,有效节约 
判断时间,充分利用了质数只能是6x-1 或者 6x+1 的特点(除2、3外),明天我 
发布这个算法,今天先消化这个 */
boolean flag=true;
for(int i=2;i<=Math.sqrt(N);i++){
  if(N%i==0){
    flag=false;
    break;
  }
}
if(flag){
  System.out.prinln("N是质数");
}else{
  System.out.println("不是");
}

AC代码:

import java.util.ArrayList;
import java.util.Scanner;
public class I007 {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        int N = s.nextInt();//得到要判断的数
        //list集合用来添加所有N以内的素数
        ArrayList<Integer> list=new ArrayList<>();
        //先将2、3添加进去
        list.add(2);
        list.add(3);
        //2、3已经添加,直接从4开始判断
        //判断质数的算法需要各位熟练掌握,以后会经常用到的
        for(int i=4;i<=N;i++){
            boolean flag=true;
            for(int j=2;j<=Math.sqrt(i);j++){
                //如果可以被整除,说明不是质数,令flag为false,退出循环
                if(i%j==0){
                    flag=false;
                    break;
                }
            }
            if(flag){//如果flag为true,说明i为质数,添加到list集合中
                list.add(i);
            }
        }
        //讲list集合中的元素改存到一个数组中
        int pnums[]=new int[list.size()];
        for(int i=0;i<pnums.length;i++){
            pnums[i]=list.get(i);
        }
        //用来计数
        int count=0;
        //寻找相邻的相差为2的个数
        for(int i=0;i<pnums.length-1;i++){
            if(pnums[i+1]-pnums[i]==2){
                count++;
            }
        }
        //输出个数
        System.out.print(count);
    }
}

关注公众号”算法宝贝“获取更多题目解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值