来自百度百科–埃拉托色尼筛选法:
(1)先把1删除(现今数学界1既不是质数也不是合数)
(2)读取队列中当前最小的数2,然后把2的倍数删去
(3)读取队列中当前最小的数3,然后把3的倍数删去
(4)读取队列中当前最小的数5,然后把5的倍数删去
(5)读取队列中当前最小的数7,然后把7的倍数删去
(6)如上所述直到需求的范围内所有的数均删除或读取
#Python
def _int_iter():#定义生成器生成大于三的奇数
n = 1;
while True:
n=n+2;
yield n;
def _int_iter(n):#定义过滤器过滤保留符合条件的
return lambda x:x%n>0
def prime():
it = _int_iter();
while True:
next(it);
yield n;
it = filter(_int_iter(n),it)#获得新序列
for n in primes(): # 构造循环条件,使之可以输出任何范围的素数序列
if n < 100: #取100以内的素数
print(n)
else:
break
这段代码较好理解主要通过生成器生成序列,过滤器保留符合条件的数字
方法一使用乘的方式:
int N = 100;
boolean[] a = new boolean[N];
for (int i = 2; i < N; i++) {
a[i] = true;
}
for (int i = 2; i < Math.sqrt(N); i++) {//获取N的平方根由于N以后的数计算就重复了
if (a[i] != false) {
for (int j = i; j * i < N; j++) {
a[i * j] = false;//排除i和比i大的数相乘后的数--这类似于99乘法表可以保证每个数都可以乘到
}
}
}
int cnt=0;
for (int i = 2; i < N; i++) {
if (a[i]) {
cnt++;
System.out.println(i);
}
}
System.out.println(N+"以内的素数有"+cnt+"个");
}
java的主要思路是通过素数的性质:一个大于1的正整数,如果除了1和它本身以外,不能被其他正整数整除,就叫素数,换句话说也就是大于1的正整数相乘后的数一定不会是素数
方法二:使用除的方式
public class Pratice_prime_numbe {
public static void main(String[] args) {
int N = 100;
boolean[] a = new boolean[N];
for (int i = 2; i < N; i++) {
a[i] = true;
}
for (int i = 2; i < Math.sqrt(N); i++) {//获取
for(int j = i+1 ; j<N;j++){
if (a[i] && j%i==0){
a[j]=false;
}
}
}
int cnt=0;
for (int i = 2; i < N; i++) {
if (a[i]) {
cnt++;
System.out.println(i);
}
}
System.out.println(N+"以内的素数有"+cnt+"个");
}
}