zoukankan      html  css  js  c++  java
  • 素数筛法—时间复杂度O(n)

    请你想出一个算法求出n以内(含n)的所有素数,要求算法的时间复杂度越小越好。

    这里介绍一种算法——快速线性素数筛法(欧拉筛法),时间复杂度O(n)。

    诀窍在于:筛除合数时,保证每个合数只会被它的最小质因数筛去。因此每个数只会被标记一次,所以算法时间复杂度为O(n)。

    具体请看下面的代码,主要函数是Prime(n)。

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 vector<int> Prime(int n) {  // 求解n以内(含n)的素数
     6     bool flag[n + 1];   // 标记数组,flag[i]==0表示i为素数,flag[i]==1表示i为合数
     7     memset(flag, 0, sizeof(flag));
     8     vector<int> prime;
     9     int cnt = 0;    // 素数个数
    10     for (int i = 2; i <= n; ++i) {
    11         if (!flag[i]) {
    12             prime.push_back(i); // 将i加入素数表
    13             cnt++;
    14         }
    15         for (int j = 0; j < cnt; ++j) { // 保证每个合数只会被它的最小质因数筛去
    16             if (i * prime[j] > n)  break;
    17             flag[i * prime[j]] = 1;
    18             if (i % prime[j] == 0)  break;
    19         }
    20     }
    21     return prime;
    22 }
    23 int main(int argc, char const *argv[])
    24 {
    25     int n;
    26     while(1) {
    27         printf("请输入n,将输出n以内(含n)的素数:");
    28         scanf("%d", &n);
    29         if(n < 0) break;
    30         vector<int> prime = Prime(n);
    31         int cnt = prime.size();
    32         printf("一共有%d个素数:
    ", cnt);
    33         for(int i = 0; i < cnt; i++) {
    34             printf("%3d ", prime[i]);
    35             if(i % 10 == 9) puts("");
    36         }
    37         puts("
    ");
    38     }
    39     return 0;
    40 }

    演示结果为:

  • 相关阅读:
    比特币全节点(bitcoind) eth 全节点
    Knowledge Tracing -- 基于贝叶斯的学生知识点追踪(BKT)
    trate
    spark
    linux 切换c++版本
    查找两个数组的相同字符(两个超大文件的相同字符)
    作业调度框架FluentScheduler
    .net与js数据交换中文乱码问题解决
    数据库死锁问题
    Service Fabric service 根据环境变量读取配置文件
  • 原文地址:https://www.cnblogs.com/jacen789/p/7816887.html
Copyright © 2011-2022 走看看