计算质数
此博客连接:https://www.cnblogs.com/ping2yingshi/p/14073134.html
计算质数
题目链接:https://leetcode-cn.com/problems/count-primes/
题目
统计所有小于非负整数 n 的质数的数量。
示例 1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例 2:
输入:n = 0
输出:0
示例 3:
输入:n = 1
输出:0
题解
思路:遍历给的数之前的所有数,统计前面素数有多少,这里我猜测普通遍历不是超时,估计就数太大,可能会超出Int 类型,事情没有那么简单。
方法:
1.先遍历给的数之前所有数。
2.利用素数公式,只能被1整除的数为素数。这里判断素数时,可以只判断到数开根号大小即可。
3.判断是否满足素数的要求。
代码
class Solution { public int countPrimes(int n) { if(n<3) return 0; int count=1; for(int i=3;i<n;i++) { int flag=1; for(int j=2;j<=Math.sqrt(i);j++) { if(i%j==0) { flag=0; break; } } if(flag==1) count++; } return count; } }
果然超时。
超时呢,想想吧3的倍数的数字排除,重新允许,还是超时。
class Solution { public int countPrimes(int n) { if(n < 3) return 0; int count = 1; for(int i = 3;i < n;i = i + 2) { int flag=1; for(int j = 3;j <= Math.sqrt(i);j++) { if(i % j == 0) { flag=0; break; } } if(flag==1) count++; } return count; } }
修改
思路
看了题解,思路是创建一个数组,先把数组全部置为true,然后利用双重循环,第一层循环给的数,第二层循环判断是否为素数。在第二层循环时,首先判断数组中对应的位置上的值是否为true。如果为真说明是素数,才接着判断每个数的倍数,素数的倍数一定不是素数,可以排除掉,在数组相应位置置为false。最后遍历数组,计算数组中有多少true。
超时
class Solution { public int countPrimes(int n) { Boolean result[] =new Boolean [n]; int count=0; for(int i=0;i<n;i++) result[i]=true; for(int i=0;i<Math.sqrt(n);i++){ if(result[i]==true){ for(int j=i*i;j<Math.sqrt(n);j=j+i){ result[i]=false; } } } for(int i=0;i<n;i++) { if(result[i]==true) count++; } return count; } }
继续修改
思路:和上面修改思路一样,这次我把判断素数语句封装成一个函数,看是否还是超时。
代码
出来混总是要还的