Java代码实现—寻找素数

目录

1、什么是素数

2、代码1

3、代码2(n/2)

4、代码3(sqrt(n))

5、代码4(函数实现)

6、结语


1、什么是素数

  • 首先我们要知道什么是素数,下面是百度百科的解释,素数又称质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

  • 我们换成代码的语言就是:数字本身n,与除了1和它本身的数字相除(/),都不能整除,即为素数,那么我们很自然的想到了代码1的方法。

2、代码1

  • 代码1的逻辑为,我们用一个循环,生成一个2>并且n<的数字,让我们的数字n,分别与这些数字做取余(%)操作,如果结果是0,那么证明数字n除了1和他本身,还有其他的因子,即不是素数;反之则是素数。
   public static void main(String[] args) {
        int n = 7;
        int i = 2;
        for (; i < n; i++) {
            if(n % i == 0) {
                System.out.println("不是素数!");
                break;
            }
        }
        //1、i==n  2、n%i==0
        if(i == n) {
            System.out.println("是素数!");
        }
    }

注意

  1. 在这个代码中,有两个条件均可以将代码执行到if(i == n)的地方:其一是for循环正常运行结束(i == n,不满足for循环条件了),
  2. 其二是 n % i这个判断成立,代码执行break,跳出for循环
  3. 所以我们这里要判断i是否等于n,以排除第二种情况,证明是for循环正常结束,即没有找到除1和本身以外的因子,这时候打印“是素数”。

3、代码2(n/2)

  • 上面的代码中我们发现:要判断这个数字是不是素数,我们至少需要运行n-2次,我们是否能改进一下这个代码呢?答案是肯定的,我们发现非素数的数字,比如:16 = 2 * 8;其中因子一定有小于n/2的数字,所以我们for循环的条件就可以改成 i <n / 2
  public static void main(String[] args) {
        int n = 9;
        int i = 2;
        for (; i <= n/2; i++) {
            if(n % i == 0) {
                System.out.println("不是素数!");
                break;
            }
        }
        if(i > n/2) {
            System.out.println("是素数!");
        }
    }

注意

  1. 代码2中for循环的次数明显比代码1要少了一半,代码效率提升
  2. 代码2中判断 if(i > n/2)这个条件与代码1中的情况一样,为了排除break的干扰,而是for循环正常运行到这里的结果。

4、代码3(sqrt(n))

  • 在代码2的基础上,我们发现一个非素数,如:16 = 2 * 8;其中总有一个因子是小于根号n的,我们利用这一特性,设置了代码3:
    public static void main(String[] args) {

        for (int j = 1; j < 101; j++) {
            //int n = 19;
            int i = 2;
            for (; i <= Math.sqrt(j); i++) {
                if(j % i == 0) {
                    //System.out.println("不是素数!");
                    break;
                }
            }
            if(i > Math.sqrt(j)) {
                System.out.println(j+" 是素数!");
            }
        }

    }

注意

  1. 代码3比代码2的运行效率更高,因为代码3,for循环的次数在i运行到根号n的时候就停止了
  2. Java中调用数学公式要用Math.来调用,这里的sqrt是取根号的意思。
  3. 最后的if(i > Math.sqrt(j))与上述的两个代码逻辑一致,这里不再赘述。

5、代码4(函数实现)

  • 代码5提供一种函数的方法,使得代码更加的简单
public static boolean isPrime(int n) {
        int i = 2;
        for (; i <= Math.sqrt(n); i++) {
            if(n % i == 0) {
                return false;
            }
        }
        if(i > Math.sqrt(n)) {
            return true;
        }
    }
  • 主函数中,只要判断isPrime函数返回的是false还是true来打印出来是不是素数即可,使得代码看起来更加的简洁。 

6、结语

我们可以发现寻找一个素数的方法,我们优化了4种方法来实现它,在今后的代码中,也希望大家能够举一反三,一起加油!!

喜欢本次blog的铁铁们,麻烦给个一键三连!

  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值