@jtahstu
2017-06-07T08:55:32.000000Z
字数 1557
阅读 2851
算法
用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。 --来自百度百科
代码中介绍了两种写法,查阅资料时有看到其他的写法,这里主要关注思想,效率还有待优化,这两种写法效率都不怎样,是有更好的写法的,那就自行Google吧。
# author: jtusta# contact: root@jtahstu.com# site: http://www.jtahstu.com# software: RubyMine# time: 2017/6/7 15:41class Prime@@array = Array.new 105,1def initialize(n=100)@n = nend# 筛法求素数,乘法def dofor i in 2..@nfor j in 2..@n/i@@array[i*j]=0endendend# 筛法求素数,加法def do_2for i in 2..@n-1@@array[i] = i%2==0?0:1end@@array[2]=1 # 特别的2是素数i = 3while i<=Math.sqrt(@n)if @@array[i]==1j = i+iwhile j<@n@@array[j]=0j+=iendendi+=2endend# 输出数组def putfor i in 2..@nif @@array[i]==1print i,' 'endendputsendendprime = Prime.newprime.doprime.putprime2 = Prime.newprime2.do_2prime2.put
各种变形中的一种,自己理解吧
#define MAX_N 1000int a[MAX_N+1];int p[MAX_N+1];int nCount=0;void Init(int n) //线性筛法,不过在小范围上(约n<1e7)不比上一个方法快{for (int i=2;i<=n;i++){if (a[i]==0){p[++nCount]=i;}for (int j=1,k; (j<=nCount) && (k=i*p[j])<=n; j++) //筛选循环{a[k] = 1 ;if (i%p[j] == 0) break;}}}#include <iostream>int main(void){Init(MAX_N);for(int n=1; p[n]>1; ++n){printf("%5d", p[n]);}return 0;}
最大公约数只有1和它本身的数叫做质数(素数)——这个应该知道吧?-_-b
至今为止,没有任何人发现素数的分布规律,也没有人能用一个公式计算出所有的素数。关于素数的很多的有趣的性质或者科学家的努力。