求n以内的素数

素数的定义

素数又叫质数,指的是 大于1的整数中,只能被1和这个数本身整除的数。

方法一:基础遍历

1.第一个for依次枚举出2到n所有数
2.每个数用第二个for进行判断

用数 i 去除以 2i-1 的每个数,一旦整数则break跳出;

注意
1.j<i 而不是 j<n
2.内层for循环完毕,表示当前的 i 不能被所有 i-1的数整除,属于素数,才添加到 list !所以这里用flag ;
一个 i 对应一个 flag。

		List<Integer> list=new ArrayList<>();
        for(int i=2;i<=n;i++){ // 依次枚举所有数
        // 一个 i 对应一个 flag。
            boolean flag=true;
            for(int j=2;j<i;j++){ // 每个数进行判断
                if(i%j==0){
                    a=false;
                    break; // 跳出循环
                }
            }
            // 必须要外层for循环完了再添加到list !
            if(flag){ // 假设j能遍历到最后都不被整除
                list.add(i);
            }
        }

或者
这种方法 2会无法进入第二个for,所以将2先添加;

		List<Integer> list=new ArrayList<>();
        for(int i=2;i<=n;i++){
            if(i==2) list.add(i);
            for(int j=2;j<i;j++){
                if(i%j==0){
                    break;
                }
                // 如果j 能遍历到最后都不悲整除
                if(j==i-1 && i%j!=0){
                    list.add(i);
                }
            }
        }

方法二:用sqrt优化

整数的因子一大一小,小的那个因子最大不超过该整数的平方根
注意 :j < = Math.sqrt(i) , 有等号 !

		List<Integer> list=new ArrayList<>();
        for(int i=2;i<=n;i++){
            boolean a=true;
            for(int j=2;j<=Math.sqrt(i);j++){
                if(i%j==0){
                    a=false;
                    break; // 跳出循环
                }
            }
            if(a){ // 假设j能遍历到最后都不被整除
                list.add(i);
            }
        }

方法三:用list中的素数来充当 j

继续探索,问题转换为判断n能否被[2,sqrt(n)]之间的奇数整除,这些奇数里面的合数是多余的。因为任何一个合数都可以分解为它前面若干个素数的积,若不能被它前面的素数整除,则亦不能被此合数整除。所以整除的范围缩小为[2,sqrt(n)]之间的素数。刚好本题目的目的就是求素数,所以可以将求得的素数放在数组内用来判断。

注意

  1. j 索引从 0开始 !
  2. 此时 j 是索引 !j 不能等于 list.size()
List<Integer> list=new ArrayList<>();
        for(int i=2;i<=n;i++){
            boolean a=true;
            for(int j=2;j<=list.size() && j<=Math.sqrt(i);j++){
                if(i%j==0){
                    a=false;
                    break;
                }
            }
            if(a){
                list.add(i);
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值