【算法】素数专题

【素数判定】

假设输入的都是正数,时间复杂度O(sqrt(n))

bool is_prime(int n){
    for(int i = 2;i*i <= n; i++){
        if(n % i == 0) return false;
    }
    return n != 1;
} 

【因数枚举】

时间复杂度O(sqrt(n)).

vector<int> divisor(int n){
    vector<int> res;
    for(int i = 1;i*i <= n; i++){
        if(n % i == 0){
            res.push_back(i);
            if(i != n/i) res.push_back(n / i);
        }
    }
}

【质因数分解】

时间复杂度O(sqrt(n)).

map<int, int> prime_factor(int n){
    map<int, int> res;
    for(int i = 2;i * i <= n; i++){
        while(n % i == 0){
            ++res[i];
            n /= i;
        }
    }
    if(n != 1) res[n] = 1;
    return res;
}

【n以内的素数】

埃氏筛法,时间复杂度O(log(log(n))),近似于O(n)。

//求n以内的素数
const int n = 10000;
int prime[n];    //素数数组,prime[i]表示第i个素数
bool is_prime[n+1];     //is_prime[i]为true表示i是素数

//返回n以内素数的个数
int sieve(int n){
    int p = 0;
    for(int i = 0;i <= n; i++) is_prime[i] = true;
    is_prime[0] = is_prime[1] = false;
    for(int i = 2;i <= n; i++){
        if(is_prime[i]){
            prime[p++] = i;
            for(int j = 2*i; j <= n; j += i) is_prime[j] = false;
        }
    }
    return p;
} 
时间: 2024-10-11 11:40:20

【算法】素数专题的相关文章

素数专题

素数专题 素数是一个经常的涉及到得内容,所以有必要整理出有关解决素数相关问题的算法 学习资料:Eratosthenes筛法和欧拉筛法对比 一般筛法求素数+快速线性筛法求素数 数学技巧之素数筛选 1 /* 2 约数枚举,复杂度O (sqrt(n)) 3 By TiaoZhan 4 */ 5 vector<int> divisor(int n) 6 { 7 vector<int> res; 8 for (int i=1; i*i<=n; ++i) 9 { 10 if (n % i

数据结构和算法设计专题之---判断单链表中是否有环,环的长度,环的入口节点

题目: 给定一个单链表,只给出头指针head: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少? 解法: 1.对于问题1,使用追赶的方法,设定两个指针slow.fast,从头指针开始,每次分别前进1步.2步.如存在环,则两者相遇:如不存在环,fast遇到NULL退出. 2.对于问题2,记录下问题1的碰撞点p,slow.fast从该点开始,再次碰撞所走过的操作数就是环的长度s. 3.问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的

数据结构和算法设计专题之---判断两个链表是否相交并找出交点

题目: 一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点. 首先来看一下如何判断两个链表是否存在相交的节点: 思路: 1.碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的. 2.当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同. 3.第三种思路是比较奇特的,在编程之美上看到的.先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null).

算法导论专题一--排序算法

排序算法作为许多程序的中间步骤,是计算机科学中的一个基本操作. 一.问题描述 排序算法输入的是n个数的一个序列<a1,a2…..an>,输出为输入的一个排列<a1’,…..an’>,满足a1’<a2’<….<an’ 简言之就是输入一个序列,输出的是这个数组元素从小到大排列的另一序列. 二.方法思想综述 从算法导论这本书上根据算法的复杂度可以将排序算法分为三种,,.,这两种方法都需要数据间的比较,而不需要. 其中有三种为选择,冒泡,插入. 选择排序:最直观,简单但是

算法导论专题一--排序算法(2)

上节分析了O(n^2)的算法,这节就分析O(nlgn)的算法-归并,快速和堆排序. 一:综述 O(nlgn) 的算法可以分为两大类,两者所用的技术差别较大.归并和快速排序采用的是分治策略,这两者相当于一个对称的过程,一个是自顶向上合并子问题,另一个则自上向下分解子问题.而堆排序利用堆这一数据结构元素间的特殊关系来排序一个序列,另外采用二叉树的方式组织数据使其效率大大提高. 二:分治策略排序算法 1.为什么使用分治? 在上节算法的分析中,不管是冒泡.选择还是插入都不适用于大规模的数据,因为数据一大

搜索引擎算法研究专题六:HITS算法

搜索引擎算法研究专题六:HITS算法 2017年12月19日 ? 搜索技术 ? 共 1240字 ? 字号 小 中 大 ? 评论关闭 HITS(Hyperlink-Induced Topic Search)是由Kleinberg在90年代末提出的基于链接分析的网页排名算法.该算法与查询相关. 用HITS算法评估网页质量,可得到内容权威度(Authority)和链接权威度(Hub).内容权威度与网页自身直接提供内容信息的质量相关,网页被引用得越多,其内容权威度越高;而链接权威度与网页提供的超链接的质

搜索引擎算法研究专题五:TF-IDF详解

搜索引擎算法研究专题五:TF-IDF详解 2017年12月19日 ? 搜索技术 ? 共 1396字 ? 字号 小 中 大 ? 评论关闭 TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术.TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度.字词的重要性随著它在文件中出现的次数成正比增加,但同时会随著它在语料库中出现的频率成反比下降.TF-IDF加权的各种形式常被搜

搜索引擎算法研究专题三:聚集索引与非聚集索引介绍

搜索引擎算法研究专题三:聚集索引与非聚集索引介绍 聚集索引介绍 在聚集索引中,表中各行的物理顺序与键值的逻辑(索引)顺序相同.表只能包含一个聚集索引. 如果不是聚集索引,表中各行的物理顺序与键值的逻辑顺序不匹配.聚集索引比非聚集索引有更快的数据访问速度. 聚集索引通常可加快 UPDATE 和 DELETE 操作的速度,因为这两个操作需要读取大量的数据.创建或修改聚集索引可能要花很长时间,因为执行这两个操作时要在磁盘上对表的行进行重组. 可考虑将聚集索引用于: 1.包含数量有限的唯一值的列,如 s

素数专题——素数筛法

关于素数的判断,大家最常用的方法估计就是循环判断到sqrt(n)的方法了:(直接上代码) bool isprime(int n) { for(int i=2;i<=sqrt(n);i++) { if(n%i==0) return false; } return true; } 这种素数的判断方法的确直观,但这种算法只对较小数据量适用,当数据量较大时,该方法就不再适用于素数的判定了.因此,我们此处引入一种新的算法——素数筛法. 首先介绍一下什么叫素数筛法: 假设所有待判断的数字的上限是L,声明一个