PAT 素数对猜想 (Java实现+详细讲解)

题意

        判断一个数即以下的数是否为素数(质数),如果是,则该数和其相邻的素数(质数)的差值是否为2,为2则记录一对

        例如:20===>19,17,13,11,7,5,3,2,1(当然我们可以在做的时候将2,1直接排除!)

        你看     ===>(19-17)=(13-11)=(7-5)=(5-3)==2    (一共有4对符合故,输入20则输出4)

        同理40===>37,31,29,23,19,17,13,11,7,5,3,2,1符合的有(31,29),(19,17),(13,11),(7,5),(5,3)         (一共有5对符合故,输入40则输出5)

       

一下为解题思想:

        1.获取输入样例及一下的所以素数(质数)

        2.判断相邻的素数(质数)之差是否为2

代码:

import java.util.Scanner;
import java.util.ArrayList;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int number = scanner.nextInt();//获取输入样例
        ArrayList<Integer> list = new ArrayList<Integer>();//存素数(质数)的数组
        int count = 0;//记录有多少对
        
        for (int a = number; a >= 2; a--) {//判断并添加素数(质数)
           if (IsPrime(a))
                list.add(a);
            }
        for (int a = 0; a < list.size()-1; a++) {//判断差值是否为2,如果是就记录加1
            if (list.get(a) - list.get(a+1) == 2 ){
                count++;
            }
        }
        System.out.print(count+"\n");
    }

    public static boolean IsPrime(int x){//该函数等下有讲解!
        for (int a = 2;a<=(int)Math.sqrt(x);a++) {
            if (x%a==0)
                return false;
        }
        return true;
    }
}

IsPrime()讲解:

        1.在判断一个数是否为素数时,很多人都会使用从 2 到这个数本身的所有整数来逐一检查,判断是否能整除。但是这样的方法会造成大量不必要的计算。

        2.取平方根是因为,每个数都可以表示为两个因子的乘积,其中一个因子小于或等于它的平方根,另一个因子大于或等于它的平方根。如果两个因子都大于它的平方根,则它们的乘积一定大于这个数,因此不可能是它的因子。

        3.以 25 为例,它的平方根为 5,因此我们只需要检查 2,3,4 和 5 是否是它的因子,就可以确定它不是素数(质数)。如果我们继续检查 6,7,8……会浪费manymany时间。

  • 28
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值