算法:埃拉托色尼筛选法求素数(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+"个");
}
}

猜你喜欢

转载自blog.csdn.net/weixin_40763557/article/details/81180835
今日推荐