要求统计所有小于非负整数 n 的质数的数量。
解法1.质数判断
遍历每一个小于n的非负整数,判断是否是质数。时间复杂度O( n n n\sqrt{n} nn),超时
class Solution {
public int countPrimes(int n) {
int res = 0;
for (int i = 2; i < n; i++) {
if (isprime(i)) {
res++;
}
}
return res;
}
private static boolean isprime(int i) {
for (int j = 2; j * j <= i; j++) {
if (i % j == 0) {
return false;
}
}
return true;
}
}
解法2.埃式筛法-O(nloglogn)
时间复杂度O(nloglogn + n)
class Solution {
public int countPrimes(int n) {
boolean[] isprime = new boolean[n];
Arrays.fill(isprime, true);
for (int i = 2; i < n; i++) {
if (isprime[i]) { // 将i的倍数筛掉
for (int j = 2 * i; j < n; j += i) {
isprime[j] = false;
}
}
}
int res = 0;
for (int i = 2; i < n; i++) {
if (isprime[i]) {
res++;
}
}
return res;
}
}
优化后的埃式筛法:
class Solution {
public int countPrimes(int n) {
boolean[] isprime = new boolean[n];
Arrays.fill(isprime, true);
for (int i = 2; i * i < n; i++) {
if (isprime[i]) { // 将i的倍数筛掉
for (int j = i * i; j < n; j += i) {
isprime[j] = false;
}
}
}
int res = 0;
for (int i = 2; i < n; i++) {
if (isprime[i]) {
res++;
}
}
return res;
}
}
#include <iostream>
#include <cmath>
using namespace std;
int main(){
//这题的关键:
//1、是sqrt,可以极大减少复杂度,若是到方根N仍大于1,则必还有且只还有1个质因数
//2、每次瞬间整除都可帮助减少遍历范围
long M=100;
while(cin>>M)
{
long count=0;
for(long j=2;j<=sqrt(M);j++)
{
while(M%j==0)
{
M=M/j;
count++;
}
}
if(M>1)count++;
cout<<count<<endl;
}
return 0;
}