JAVA算法:统计素数的数量

该博客介绍了一种JAVA算法,用于统计小于给定非负整数n的所有质数数量。算法利用了素数特性,通过数组标记合数,避免了重复计算,并在遍历过程中有效减少了计算量。例如,输入10时,算法输出4,表示2, 3, 5, 7是小于10的4个质数。文章还探讨了素数的性质和优化算法设计。" 132876067,19669826,使用OpenCV进行平面追踪:Python代码实战,"['计算机视觉', 'OpenCV', '追踪算法', 'Python编程', '视频分析']
摘要由CSDN通过智能技术生成

JAVA算法:统计素数的数量

统计所有小于非负整数 n 的质数的数量。

示例:

输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。


算法设计

用数组flag标记非素数,每当出现一个flag[i]为false,计数器count加一。
关于素数有三点:

  1. 大于3的素数一定是奇数,如3,5,7;
  2. 奇数中的非素数也一定是奇数的乘积。
  3. 对于一个很大的数n,它的两个因数i和j中一定有一个小于n的开方,所以我们让i <= Math.sqrt(n),j >= n,这样可以避免重复讨论一些情况。

首先,我们用i从3到Math.sqrt(n)进行标记。
其次,根据上述的第2、3两点,通过乘积i*j对应index的方法对在flag中对合数为index的值赋值true,j+=2,外层一样,i+=2,因为大于3的数中只有奇数有可能是质数,而这些质数i可以通过j的循环标记所有i作为因数的合数。
标记完所有的合数之后,再用Math.sqrt(n)到n之间的遍历,count所有未被标记true的质数。

public int countPrimes(int n) {
       boolean[] mark = new boolean[n];
        if (n <= 2) return 0;
        int i = 3, count = 1; //i from 3, so there is o
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值