JAVA面试题-算法题(求质数)

求解素数(质数)集合的3种常用算法整理(Java)

质数定义:只能被1或者自身整除的自然数(不包括1),称为质数。

方法一:根据质数的定义求(效率最低)

利用它的定义可以循环判断该数除以比它小的每个自然数(大于1),如果有能被它整除的,则它就不是质数。
时间复杂度:O(n^2)
/**
     * 判断传入数值是否为素数
     * @param numSum
     * @return flag
     */
    private static boolean isPrime1(int numSum){
        boolean flag=true;              //判断是否为质数的标记
        for (int j=numSum-1;j>1;j--){   //逐个除以[1,n]区间的数字
            if (numSum%j==0){
                flag = false;           //若能整除,则置false标记为合数
            }
        }
        return flag;
    }

方法二:利用合数定理(原理和方法一一致,效率提高了)

如果一个数是合数,那么它的最小质因数肯定小于等于他的平方根。
例如,20的最小质因数4必然小于20开方。
时间复杂度:O(n^1/2)
/**
     * 方法二
     * @param num
     * @return
     */
    private static boolean isPrime2(int num){
        int s = (int) Math.sqrt(num); 	//求出数字n的开方
        boolean flag = true;			//判断是否为质数的标记
        for (int j=2;j<=s;j++){			//逐个除以[1,n^1/2]区间的数字
            if (num % j == 0){
                flag = false;			//若能整除,则置false标记为合数
            }
        }
        return flag;
    }

方法三:筛法求质数(效率最高,但会比较浪费内存)

首先建立一个boolean类型的数组,用来存储你要判断某个范围内自然数中的质数.
例:
你要输出小于100的质数,可以建立一个大小为101(建立11个存储位置是为了让数组位置与其大小相同)的
boolean数组,位置1置false,其他位置初始化为true。
即数组初始状态 [null,false,true,true......]

然后再获取数字n的开方,即10,然后再从2开始,2的倍数位置置false,即 4 6 8 10....,
3的倍数位置置false即 6 9 12..........,以此类推,就把初始数列的合数位置值变成false,true值的位置则为素数。
/**
     * 通过对数组进行标记后,再逐个判断
     * @param num
     * @return
     */
    private static boolean [] isPrime3(int num){
        boolean [] array = new boolean[num+1];  //加1为了数组位置一致
        array[1] = false;                       //false为合数,ture为质数    1不是质数
        for (int i = 2;i < num;i++){
            array[i] = true;                    //生成一个长度为n的布尔数列 [null,false,true........]
        }
        int s = (int)Math.sqrt(num);
        for (int i = 2;i<=s;i++){
            if (array[i]){                      //检查是否已经置fales(可以防止重复置false)
                for (int j=i;j*i<=num;j++){      //将i的倍数下标位置置为false
                    array[j*i] = false;
                }
            }
        }
        return array;                           //标记好后的数组返回
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值