快速线性筛法的原理和值得借鉴的方法
2014-11-17 12:13
239 查看
筛法求素数就是先认定所有的数是素数(int a[10000]={0}),再通过一些方法把合数踢掉(a[i']=1)
一般筛法的思想是:从2开始找,素数的倍数(1倍、2倍、3倍,,,)为合数。它的缺点是会重复筛除一些合数 ( 像筛除3*5之后又会筛除5*3,这样会使复杂度很大)
快速线性筛法的特点就是不会重复筛除一个合数。它的原理是
前提是:一个合数 i=p1*p2*...*pn, pi都是素数(2<=i<=n), pi<=pj ( i<=j )
p1是最小的系数。这样每一个合数就有一个确定的表示方法,不会重复。(像12=2*2*3)
No.21:我们现在规定一个合数由两个数得到。
NO.2:那么合数有两种。1.素数*素数=合数 2.一个最小的素数*合数=合数
如果遇到i为素数,那么一个大的素数 i 乘以不大于 i 的素数,这样筛除的数跟之前的是不会重复的
如果遇到i为合数,我们只认为合数由一个最小的素数*合数得到,也不会重复(就像12=2*6而不是12=3*4)
那么代码来了
一般筛法的思想是:从2开始找,素数的倍数(1倍、2倍、3倍,,,)为合数。它的缺点是会重复筛除一些合数 ( 像筛除3*5之后又会筛除5*3,这样会使复杂度很大)
快速线性筛法的特点就是不会重复筛除一个合数。它的原理是
前提是:一个合数 i=p1*p2*...*pn, pi都是素数(2<=i<=n), pi<=pj ( i<=j )
p1是最小的系数。这样每一个合数就有一个确定的表示方法,不会重复。(像12=2*2*3)
No.21:我们现在规定一个合数由两个数得到。
NO.2:那么合数有两种。1.素数*素数=合数 2.一个最小的素数*合数=合数
如果遇到i为素数,那么一个大的素数 i 乘以不大于 i 的素数,这样筛除的数跟之前的是不会重复的
如果遇到i为合数,我们只认为合数由一个最小的素数*合数得到,也不会重复(就像12=2*6而不是12=3*4)
那么代码来了
#include<iostream> using namespace std; const long N = 200000; long prime = {0},num_prime = 0; int isNotPrime = {1, 1}; int main() { for(long i = 2 ; i < N ; i ++) { if(! isNotPrime[i]) prime[num_prime ++]=i; //关键处1 for(long j = 0 ; j < num_prime && i * prime[j] < N ; j ++) { isNotPrime[i * prime[j]] = 1; if( !(i % prime[j] ) ) //关键处2 break; } } return 0; }
相关文章推荐
- (值得借鉴)名家学英语的方法
- 一种快速为结构体赋值得方法
- 硕士论文查重原理与快速通过的七大方法
- 古人值得借鉴的阅读方法
- 关于快速记忆的原理和方法介绍
- 一种快速的未登陆词识别方法(原理和实现)
- apply 和 call 方法(除学习此文章中的技术外,文章的写作方式也非常值得借鉴)
- 硕士论文查重原理与快速通过的七大方法
- 硕士论文查重原理与快速通过的七大方法
- 硕士论文查重原理与快速通过的七大方法(转载)
- 二十一、倦鸟知归(分析方法值得借鉴)
- 硕士论文查重原理与快速通过的七大方法(转载)
- 硕士论文查重原理与快速通过的七大方法
- 手机电池快速充电的方法和原理
- 硕士论文查重原理与快速通过的七大方法
- 一种快速的未登陆词识别方法(原理和实现)
- 硕士论文查重原理与快速通过的七大方法
- 硕士论文查重原理与快速通过的七大方法(转载)
- 菜鸟学习之Android Fragment 开发,快速提升用户体验的方法-布局规划之如何借鉴?
- 支付宝扫福字原理及快速获得“福卡”方法