计数质数的思路和JAVA代码实现之

import java.util.Arrays;

public class CountPrimes {

    public static void main(String[] args) {
        CountPrimes test = new CountPrimes();
        int count = test.countPrimes(10);
        System.out.println(count);
    }

    //统计所有小于非负整数 n 的质数的数量。
    //思路1:直接求--》时间复杂度太大
    public int countPrimes(int n) {

        int count = 0;
        int j;
        for (int i = 2; i < n; i ++) {
            for (j = 2; j <= i - 1; j ++) {
                if (i % j == 0) {
                    break;
                }
            }
            if (j == i) {
                count ++;
            }
        }

        return count;
    }

    //思路2:根据思路1改进:
    //首先,确认一个数 n 是否是素数,只需要判断 2 - sqrt(n)根号n, 因为根号n后面的就是前面的两个因子交换位置而已,一次不需要再往后判断了
    //第二,如果一个数p 是素数,那么2 * p, 3 * p, 4 * p,.......都不可能是素数了,因此也需要跳过这些判断
    public int  countPrime(int n) {
        boolean [] isPrime = new boolean[n];
        Arrays.fill(isPrime,true);//初始化默认所有的数都是素数

        for (int i = 2; i * i < n; i ++) {//只需要判断 2 - sqrt(n)根号n, 因为根号n后面的就是前面的两个因子交换位置而已,一次不需要再往后判断了
            if (isPrime[i]) {
                for(int j = i * i; j < n; j += i) {//j = i * i, j += i, 避免重复前面已经判断过的
                    isPrime[j] = false;//如果一个数p 是素数,那么2 * p, 3 * p, 4 * p,.......都不可能是素数了,因此也需要跳过这些判断
                }
            }
        }

        //经过以上操作,所有真正的素数已经拿到
        int count = 0;
        for (int i = 2; i < n; i ++) {
            if (isPrime[i]) {
                count ++;
            }
        }

        return count;
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值