python,用Sieve of Eratosthenes(埃拉托斯特尼筛法),打印【0,100】之间的所有质数


import numpy as np


# 用 Sieve of Eratosthenes(埃拉托斯特尼筛法),打印【0,100】之间的所有质数。
def way1():  # 方法一,用prime数组,两层for循环一个一个标记
    arr = np.arange(2, 101)
    prime = np.ones(len(arr), dtype=bool)

    for i in range(2, len(arr)):  # 被除数
        for j in range(i - 1, len(arr)):  # 下标

            if arr[j] % i == 0:
                prime[j] = False

    return arr[prime]


def way2():  # 方法二,用arr[arr % i != 0],整个数组一起判断,只对比当前被除数大的数据做取模计算,删除非质数,最后连接上比当前数据小的质数。
    arr = np.arange(2, 101)

    for i in range(2, 101):
        arr_tmp = arr[arr > i]
        tmp_start = len(arr) - len(arr_tmp)  # 找到第一个大于i的数的下标
        # you may don't tag, just delete in-prime ones.
        new_arr_tmp = arr_tmp[arr_tmp % i != 0]
        # print(type(new_arr_tmp))  # 看类型,是ndarray,所以不能用list的方法“+”直接相连接
        arr = np.concatenate((arr[0:tmp_start], new_arr_tmp))  # 连接两个ndarray方法
    return arr


if __name__ == '__main__':
    arr1 = way1()
    arr2 = way2()
    # 方法二比方法一巧妙得多,我想的!
    print(arr1, "len:", len(arr1))
    print(arr2, "len:", len(arr2))

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM