算法:埃拉托色尼筛选法求素数(Python和Java

来自百度百科–埃拉托色尼筛选法:
(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+"个");
}
}

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注