素数判断及打印素数

给定一个数字,判定一个数字是否是素数

素数:只能被1或者本身整除的数

2 -> (n-1)之中的数字来试除,如果能被除了1和本身的数字整除,就不会有余数,即做%运算后结果为0。

public static void main(String[] args) {
        // 判定素数
        // 素数:只能被1或者本身整除的数
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int flag = 1;// 假设是素数
        // 开始试除
        for (int i = 2; i < n; i++) {
            if (n % i == 0) {
                flag = 0;// 不是素数
                break;
            }
        }
        if (flag == 1 && n != 1) {
            System.out.println(n + "是素数");
        } else {
            System.out.println(n + "不是素数");
        }
    }

要注意的一点,1也不是素数(可以在百度上查),所以循环之后的if语句中要加上对1的判断。
素数判断


打印 1 - 100 之间所有的素数

判读逻辑与上述一样,只不过多了一个循环,需要先生成1-100的数字,同时也可以设定一个计数器,看有多少个素数。

public static void main(String[] args) {
        // 生成1-100的数
        int count = 0;
        for (int i = 1; i <= 100; i++) {
            int flag = 1;// 假设是素数
            // 开始试除
            for (int j = 2; j < i; j++) { 
                if (i % j == 0) {
                    flag = 0;// 不是素数
                    break;
                }
            }
            if (flag == 1 && i != 1) {
                count++;
                System.out.print(i + " ");
            }
        }
        System.out.println("\ncount = " + count);
    }

素数打印


算法优化

首先,1 不是素数,所以在生成数的循环中可以从 2 开始,并且在flag判断条件中删除对 1 的判断。
其次,对于一个不是素数的数字来说,它一定可以写成一大一小两个数的乘积,比较特殊的一些数可以正好开平方,因此对数字进行开平方运算,将结果作为循环条件,只要有小的一头数字满足,那另一头大的数字也必然满足,这样做就砍掉了一半需要试除的数,大大提高了运行效率。

public static void main(String[] args) {
        // 生成1-100的数
        int count = 0;
        for (int i = 2; i <= 100; i++) {
            int flag = 1;// 是素数
            // 开始试除
            for (int j = 2; j <= sqrt(i); j++) {
                if (i % j == 0) {
                    flag = 0;// 不是素数
                    break;
                }
            }
            if (flag == 1) {
                count++;
                System.out.print(i + " ");
            }
        }
        System.out.println("\ncount = " + count);
    }

在Java中,sqrt() 需要导入 java.lang.Math.sqrt;
在C语言中,sqrt 需要用 <math,h>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值