素数

判断素数的方法

素数: 一个正整数,如果只有1和它本身两个因数,那么它就是一个素数。

用 Java 代码判断数字 n 是否为素数,方法有很多,这里介绍三种
其实这三种方法本质上都是遍历,不过遍历的次数相差很大

  • 第一种:遍历 [2,n)
  • 第二种:遍历 (2,根号n]
  • 第三种:遍历 (5,根号n]
第一种:遍历 [2,n)

方法: 用 n 对 [2,n) 中的数字进行整除,如果都不能整除,那么 n 为素数

public static void main(String[] args) {

        System.out.print("输入数字: ");
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();

        // 标志位,默认输入的数字是素数
        boolean flag = true;

        if(num == 2){
            flag = true;
        }
        
        // 循环遍历,进行判断
        for(int i = 2; i < num; i++){
            // 如果余数为 0,标志位改为 false,同时退出循环
            if (num % i == 0){
                flag = false;
                break;
            }
        }

		// 根据标志位判断
        if (flag){
            System.out.println(num + "是素数");
        } else {
            System.out.println(num + "不是素数");
        }
    }
第二种:遍历 (2,根号n]

方法: 假设 a * b = c,且 c = m * m ,则会发现 a <= m,b >= m

对于素数 n 而言,只有 1 * n = n 一种情况,因此如果 (2,根号n] 中没有一个数字可以整除,那么 n 是素数

// 代码跟第一种大体相同,只是循环的条件发生了变化

for(int i = 2; i <= Math.sqrt(num); i++)
第三种:遍历 (5,根号n]

方法: 当 n >= 5时,如果 n 为素数,那么 n 一定在 6 的倍数旁边出现

原因: 在大于 5 的情况下,如果 n 是素数,那么 n 一定是一个奇数

将 5 和 5 之后的数字表示成下面这种形式:

6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+6),6(x+1)+1

上面数字的形式可以改成这样:6x-1,6x,6x+1,2(3(x+1)) ,3(2x+1) …

于是会发现: 6x,6x+2,6x+3,6x+4 都可以被整除,6x+5 就相当于是下一个 6x-1

由此可见,素数只可能出现在 6x-1 和 6x+1 的位置,即 6 的倍数的左右出现

注意:6 的倍数左右的数字不一定是素数,需要循环排除

public static void main(String[] args) {

        System.out.print("输入数字: ");
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();

        // 标志位,默认是素数
        boolean flag = true;

        if(num == 2 || num == 3 || num == 5){
            flag = true;
        }
        
        // 判断该数字是否是 6 的倍数左右的数字
        // 如果不是,那么它一定不是素数
        if (num % 6 != 1 && num % 6 != 5) {
            flag = false;
        }

        // 如果是 6 的倍数左右的数字,进行筛选,看 num 是否是它们的倍数
        for(int i = 5; i <= Math.sqrt(num); i += 6){
            // 在 [5,根号 num] 中对 6 左右的数字进行判断
            // 执行一次循环,i = i + 6
            // 如果发现 num 能整除,表示不是素数
            if (num % i == 0 || num % (i + 2) == 0){
                flag = false;
                break;
            }
        }

        if (flag){
            System.out.println(num + "是素数");
        } else {
            System.out.println(num + "不是素数");
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值