输出不超过n的所有素数 (筛法)
来源:互联网 发布:webuploader java demo 编辑:程序博客网 时间:2024/05/29 04:48
O(nlogn) 的算法,还不错。
思想:
设置2为素数,然后划去所有2的倍数
然后查找2后面第一个没被划去的数(为3),然后知道3为素数,划去所有3的倍数
然后查找3后面第一个没被划去的数,由于4已经被划掉,所以下一个将会找到5,划去所有5的倍数...
以此类推
需要注意的三点是:
(1)遇到合数则跳过
(2)划去素数p的倍数时,从p*p开始划去,因为p*m (m < p)的数已经被划去了(它是m的最小质因子的倍数)
(3)由(2),在划去时,所有的大于 sqrt(n) 的素数都不用划去它的倍数,直接跳过
代码如下:
#include <stdio.h>#include <time.h>#include <math.h>#include <windows.h>inline int GetPrimes(int MAX_NUMBER){int start = clock();ULONG Count = 0;BYTE* List;List = new BYTE[MAX_NUMBER + 1];memset(List, 0x01, MAX_NUMBER + 1);int tmp = sqrt(MAX_NUMBER);//List[2] = 1;for (int i = 2; i <= MAX_NUMBER; i++) {if (List[i]) {Count++;//printf("%d ", i);if (i > tmp) continue; ULONG Buf = i * i;while (Buf <= MAX_NUMBER) {if (List[Buf]) {List[Buf] = 0;}Buf += i;}}} int end = clock();printf("Count = %.8d, ", Count);printf("Running time = %dms.\n", end - start);free(List);return end - start;}#define TEST_COUNT 10int main(){int stime = 0;printf("MAX_NUMBER = %d\n", 1000000);for (int n = 0; n < TEST_COUNT; n++) {stime += GetPrimes(1000000);}printf("Average Time: %dms\n\n", stime / TEST_COUNT);stime = 0;printf("MAX_NUMBER = %d\n", 10000000);for (int n = 0; n < TEST_COUNT; n++) {stime += GetPrimes(10000000);}printf("Average Time: %dms\n\n", stime / TEST_COUNT);stime = 0;printf("MAX_NUMBER = %d\n", 100000000);for (int n = 0; n < TEST_COUNT; n++) {stime += GetPrimes(100000000);}printf("Average Time: %dms\n\n", stime / TEST_COUNT);return 0;}
做测试的结果还不错(难道是我的电脑比较好...):
0 0
- 输出不超过n的所有素数 (筛法)
- 输出2-n的所有素数
- OJ输出n以内的所有素数
- 输出1~N之间的所有素数
- 输出所有不小于N的素数(一)
- 输出所有不小于N的素数(二)
- 输出小于N的所有质数(素数)
- 求n以内的所有素数并输出
- P51.17(输出2-n之间所有的素数。)
- 设计一个函数,输出整数n的所有素数因子
- 输入一个偶数N,输出所有素数对之和等于N的素数对
- 输出2-n之间所有素数
- 关于素数:求不超过n的素数,素数的判定(Miller Rabin 测试)
- 求n的所有素数
- 输出所有小于等于n(n为一个大于2的正整数)的素数
- 输入任意一个大于2的正整数n,输出所有小于等于n的素数
- c语言 输出所有小于n(n>=2正整数)的素数
- P51 第17题 输出2-n之间的所有素数,n由键盘输入
- linux 大文件分割 split
- 输入任意abc的值,求方程ax^2+bx+c=0的根
- Android桌面Launcher2修改笔记
- mfc自定义控件的编程
- win7下80端口被(Pid=4)占用的解决方法
- 输出不超过n的所有素数 (筛法)
- 嵌入式测试中数据获取的几种方式
- 1、MyBatisNet的安装使用
- LINQ to JavaScript 源码分析
- hdu-1250
- Linux下安装mysql5.6社区版 和redis 2.8
- 软件缺陷的分类与管理
- [ExtJS5学习笔记]第二十五节 利用window.open()函数实现ExtJS5的登陆页面跳转
- fastJson的简单实用