你真的懂素数吗?

  • 概念
  • 案例
  • 求法

素数:即质数
定义:大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数(即除了1和本身没有其他因子)

首先,我们先来看一个数与其因子有什么关系(除了本身的因子)?
因子<=数本身/2
如10 的因子:1、2、5
因为2*5=10 ; 5是10的1/2;如果A因子大于5,则B因子就必须是(1,2)即1和2之间的小数,显然不可能;

所以求素数时只需要将数取模遍历其一半;(当然你也可以遍历到该数的前一位,但是浪费资源不推荐)
例1:输入一个数判断其是否是素数?

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数");
        int i = sc.nextInt();
       if (isprime(i)){
           System.out.println("是素数!");
       }else {
           System.out.println("不是素数!!");
       }
    }
    public static boolean isprime(int n){
        boolean flag=true;
        for (int i=2;i<n/2;i++){ //遍历数的一半
            if(n%i==0){  // 取模如果等于0,则说明有因子,就不是素数!
                flag=false;
            }
        }
        return flag;
    }

那就可能有大佬问了 为什么你遍历那里i<n/2而不是i<=n/2 不是说遍历到一半吗?
在这里插入图片描述
咳咳~你想一哈,如果都遍历到了该数1/2的前一位了,它如果是素数肯定在该数的1/2前已经有因子了。
如:数10的1/2是5,要遍历其一半即i=1~5,然后将10%i ,但是i=2的时候已经有因子了,所以无需遍历到5,当然也可以i<=n/2 哈哈
(这么说求素数岂不是有更好的算法?的确,只要求出该数的最小因子即可,emmmm具体本人小白是不太了解了(卑微))

如果是求某个数的所有因子方法可不能这样!!
如:求某个数的所有因子?

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        //for (int i = 1; i < n/2; i++) 输出没有本身的因子并且如果是偶数没有n/2的因子
        //for (int i = 1; i <= n/2; i++) 输出没有本身的所有因子
        //for (int i = 1; i < n; i++) 输出没有本身所有因子
        for (int i = 1; i <= n; i++) { //输出所有因子包括本身
            if (n%i==0){
                System.out.println(i);
            }
        }
    }

例2:遍历打印100内的所有素数?

public static void main(String[] args) {
        for (int i = 2; i <= 100; i++) {
            if (isprime(i)){ //传入i 然后调用isprime(i)判断i是否是素数,如果为true则进入if语句,打印素数
                System.out.println(i);
            }
        }
        }
        public static boolean isprime(int n){ //判断素数的方法
            boolean b=true;
            for (int i=2;i<n/2;i++){   
                if(n%i==0){   //如果取模有等于0的,说明不是素数
                    b=false;
                }
            }
            return b;
        }

还有i<=Math.sqrt(n)遍历法求素数,

public static boolean isprime(int n){ //判断素数的方法
            boolean b=true;
            for (int i=2;i<=Math.sqrt(n);i++){
                if(n%i==0){   //如果取模有等于0的,说明不是素数
                    b=false;
                }
            }
            return b;
        }

即遍历到根号下n,然后取模判断即可。前面是遍历到n/2,这里直接是只遍历到√n 明显快了很多。

那又有大佬问小白了,为啥子可以这样嘞??
本小白陷入沉思……
在这里插入图片描述
看看下面~

n√nn的因子
6√6=21、2、3、6
10√10=31、2、5、10
20√20=41、2、4、5、10

发现n的因子在√n的左右都有,但是n一定有个因子<=√n;所以我们只需要遍历到√n即可;

其他算法什么的小白这里就木了,告辞
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值