关于线性筛时间复杂度(初学
  • 板块学术版
  • 楼主XSean
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/1/22 09:32
  • 上次更新2023/10/24 03:21:36
查看原帖
关于线性筛时间复杂度(初学
546830
XSean楼主2023/1/22 09:32

总感觉在内层循环也要算时间复杂度,好像不是O(n),但确实是O(n),为什么?

#include <bits/stdc++.h>
/*
筛质数核心:无论primes[j]是什么,只要小于i,那么一定是i * primes[j]的最小质因子
1.从2到n遍历查找质数,若未标记就是质数,计数++
2.循环所有已存质数来找合数,若找到一个数的最小质因数就跳出
*/
using namespace std;

const int N = 1000010;
int n;
int cnt;
int primes[N];
bool st[N];

int get_prime(int n){
    for(int i = 2; i <= n; i++){
        if(!st[i]) primes[++cnt] = i;
        for(int j = 1; primes[j] <= n / i/*primes * i 是被删除的合数,不能超过n*/; j++){
            st[i * primes[j]] = true;//
            if(i % primes[j] == 0) break;//找到了最小的质因数,就退出
        }
    }
}

int main(){
    cin >> n;
    get_prime(n);
    cout << cnt;
    return 0;
}


2023/1/22 09:32
加载中...