素数判断
2016-05-17 20:05
260 查看
问题:求出所有小于等于n的素数
素数判断方法:方法1:
原理:一个数 n 如果是合数,那么它的所有的因子不超过sqrt(n)–n的开方;方案:使用循环解决;
时间复杂度:o(n*sqrt(n))
当n很大时很耗时;
void PrimeNumber(int n, int* primer, int& primer_num) { primer_num = 0; int sqrt_i, i, j; for (i = 2; i <= n; i++) { sqrt_i = (int)sqrt(i); for (j = 2; j <= sqrt_i; j++) if (i%j == 0) break; if (j > sqrt_i) primer[primer_num++] = i; } }
2.筛选法:这种方法主要用于打素数表,如求出n之内的所有素数,其思路是从1开始遇到一个素数就标记一下,并去掉n之内的大于它的所有倍数,直循环到n:
此方法也有局限性,数据量中等时才不会超时,数据量过大时也会超时,而且只能用素数打表,不能对单个数进行判定!void PrimeNumber(int n, int* primer, int& primer_num) { if (n < 2) { primer_num = 0; return; } primer[0] = 2; primer_num = 1; for (int i = 1; i < n / 2 + 1; i++) primer[i] = true; for (int i = 1; i < n / 2 + 1; i++) { if (primer[i] && (2 * i + 1) <= n) { primer[primer_num++] = 2 * i + 1; for (int j = 3 * i + 1; j < n / 2 + 1; j = j + 2 * i + 1) primer[j] = false; } } }
3.《离散数学》上的一个定理
定理为:“若正整数a>1,且a不能被不超过a的平方根的任一素数整除,则a是素数”,优缺点:此方法可以对超大量数据的进行打表!
此方法也同样合适于素数打表,判定单个时这个方法不可取!
bool IsPrimerNum(int n, int* primer, int&primer_num) { int sqrt_i= (int)sqrt(n); for (int i = 0; primer[i] <= sqrt_i&&primer_num; i++) { if (n%primer[i] == 0) return 0; } return 1; } void PrimeNumber(int n, int* primer, int& primer_num) { primer_num = 0; for (int i = 2; i <= n; i++) if (IsPrimerNum(i, primer, primer_num)) primer[primer_num++] = i; }
参考:/article/7815209.html
参考:大神/article/8115726.html
相关文章推荐
- Git——跟踪或取消跟踪文件
- iOS设计规范
- 定义长方体类,数据成员有长、宽、高,成员函数有带默认形参值的构造函数(默认长宽高分别为2.5、3.4、2)、计算体积函数,分别构造默认对象和长宽高分别为6.25、4.8、5.2的对象,输出各对象的体积
- LeetCode -- Word Ladder
- BZOJ4551: [Tjoi2016&Heoi2016]树
- 51nod-1289-大鱼吃小鱼(栈的应用)
- 杭电1509
- 笔试题58. LeetCode OJ (45)
- Codeforces Round #353 (Div. 2) C. Money Transfers 环、贪心、前缀和推广、好题
- hdu 1878
- HDU 1560 IDA*
- 马兴150809305C语言的指针、链表的原理和各类操作
- Spark定制班第6课:Spark Streaming源码解读之Job动态生成和深度思考
- 图的DFS遍历(python版本)
- 网络编程之FIFO
- 彻底理解ThreadLocal
- hive中的lateral view 用法详解下篇
- PAT-4C-L3-003-社交集群(并查集)
- cas
- "围观"设计模式(12)--结构型之代理模式(Proxy Pattern)