素数筛选法
2013-12-02 19:12
246 查看
基本思想:素数的倍数一定不是素数
实现方法:用一个长度为N+1的数组保存信息(0表示素数,1表示非素数),先假设所有的数都是素数(初始化为0),
从第一个素数2开始,把2的倍数都标记为非素数(置为1),一直到大于N;然后进行下一趟,找到2后面的下一个素数3,
进行同样的处理,直到最后,数组中依然为0的数即为素数。
说明:整数1特殊处理即可。
优化
实现方法:用一个长度为N+1的数组保存信息(0表示素数,1表示非素数),先假设所有的数都是素数(初始化为0),
从第一个素数2开始,把2的倍数都标记为非素数(置为1),一直到大于N;然后进行下一趟,找到2后面的下一个素数3,
进行同样的处理,直到最后,数组中依然为0的数即为素数。
说明:整数1特殊处理即可。
#include <stdio.h> #include <string.h> #include <time.h> int a[100000001]; int main() { int i, j, n; memset(a, 0, sizeof(a)); while (scanf("%d", &n) != EOF) { //n = 100000000; for (i = 2; i <= n; i++) { //如果是素数 if (a[i] == 0) { for (j = i + i; j <= n; j += i) { a[j] = 1; } } } printf("time: %.2lf", (double) clock() / CLOCKS_PER_SEC); /* printf("2 "); for (i = 3; i <= n; i++) { if (a[i] == 0) { printf("%d ", i); } } */ } return 0; }
优化
#include<stdio.h> #define Max 100000000 int a[Max + 1]={1,1}; int main() { int i,j; for(i=4;i<=Max;i+=2) { a[i]=1; } for(i=3;i*i<=Max;i++) { if(!a[i]) { for(j=3*i;j<=Max;j+=2*i) { a[j]=1; } } } return 0; }
相关文章推荐
- PAT甲题题解-1059. Prime Factors (25)-素数筛选法
- JavaScript使用filter方法实现100以内素数的快速筛选
- POJ 2689 Prime Distance(大区间素数筛选)
- 线性筛选素数模板
- poj 2689 巧妙地运用素数筛选
- 【算法】筛选法统计素数--埃拉托色尼筛
- 筛选法求100以内的素数
- NUC1019 数素数【素数筛选法】
- LightOJ 1197 Help Hanzo (区间素数筛选法)
- ZOJ2723 Semi-Prime【素数筛选+试探法】
- CodeForces 546D Soldier and Number Game(素数筛选)
- ACM常用素数判断筛选法及其优化
- 素数筛选法----孪生素数问题
- 埃拉托斯特尼筛法 VS 欧拉筛法 (素数筛选) Java
- 梦工厂实验室 素数求和 神奇的素数筛选
- 6N±1素数筛选法
- HDU NO.2546 素数回文(筛选法求素数表)
- Prime Time 素数筛选+玄学1e-8
- 筛选法构造素数表
- PHP判断素数,循环,筛选——默认可执行时间秒数,默认可执行空间。用来测试运行效率