素数筛选法,快速获取素数序列
来源:互联网 发布:中级c 程序员面试问题 编辑:程序博客网 时间:2024/06/13 22:31
今天,学习了素数求取的方法,感觉很棒,拿来分享一下。首先,对比一下两种方法:普通求取素数的方法和基于筛选法的素数求取方法。
-普通方法求取素数
普通方法求取素数是根据素数的定义来判断一个数N是否为素数(只有1和它本身能够整除自己)。因此,该方法一般方式是测试1到的N所有数是否整除N,来判断N是否为素数的。代码示例如下:
#include<stdio.h>#include<math.h>#define N 10000001int prime[N];int main(){ int i, j, num = 0; for(i=2; i<N; i++) { for(j=2; j<=sqrt(i); j++) if( j%i==0 ) break; if( j>sqrt(i) ) prime[num++] = i; } for(i=2; i<100; i++) //只输出2-100内的素数 if( prime[i] )printf("%d ",i); return 0;}
这段代码在我的1G内存,单核CPU的云主机上,会运行相当长的时间。
-基于筛选法的素数求取方式
基于筛选法的素数求取方式:用数组的方式存取筛选候选集,根据质数的倍数不是质数,偶数不是质数的原则进行一次次筛选。但是,不知道为什么for循环的结束位置是sqrt(N)?
#include <stdio.h>#include <math.h>#define N 10000001int prime[N];int main(){ int i, j; for(i=2; i<N; i++){ if(i%2) prime[i]=1; else prime[i]=0; } for(i=3; i<=sqrt(N); i++) { if(prime[i]==1) for(j=i+i; j<N; j+=i) prime[j]=0; } for(i=2; i<100; i++)//只输出2-100内的素数 if( prime[i]==1 )printf("%d ",i); printf("\n"); return 0;}
基于筛选法的素数求取方式,运行时间短。一部分原因是时间复杂度小,一部分原因是省去了CPU开根号占用的时间。综上,基于筛选法的素数求取方式是一个快速、实用的求取素数的方法。
另外,还可以针对基于筛选法的素数求取方式做进一步的优化。简化数组的占用空间:因为所有的偶数都不是质数(除2之外),所以数组可以只存放奇数,省掉一半的占用空间。
0 0
- 素数筛选法,快速获取素数序列
- 素数快速筛选法
- 素数筛选法--快速查找素数
- 筛选法快速查找素数
- 筛选法--快速求素数
- 素数 筛选获取
- NYOJ-187-快速查找素数(素数筛选法)
- 快速筛选法求素数表
- 素数筛实现素数的快速筛选
- 素数筛选与快速幂取模
- 快速幂取模&&素数筛选&&最大公约数
- 快速线性素数筛选[模板]
- 筛选法求素数
- 筛选法求素数
- 筛选法求素数
- Eratoshenes素数筛选法
- 素数--超强筛选法
- 素数筛选法
- Java中对栈和堆的理解
- python中 if __name__ == '__main__': 的解析
- OpenJudge noi 04网线主管
- c语言基础面试题
- iframe嵌入网页的用法
- 素数筛选法,快速获取素数序列
- 20161101
- 栈内存 堆内存
- ADS2014中的电路符号(symbol)设置及使用
- #include<stdio>与#include"stdio"的区别
- Apple Pay 技术分享_陈hong_鑫
- .tmux.conf设置
- 神经网络九:Regularization(正则化)与Dropout
- PCB Layout Experience