赞
踩
写了那么久的博客,始于Python爬虫,目前专于Java学习,终于有了属于自己的小窝,欢迎各位访问我的个人网站,未来我们一起交流进步。
质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。素数在数论中有着很重要的地位。比 1 大但不是素数的数称为合数。1 和 0 既非素数也非合数,2 是素数。
1.判断是否是素数:
import timeit from math import sqrt def isPrimes1(n): if n <= 1: return False for i in range(2, int(sqrt(n) + 1)): if n % i == 0: return False return True def isPrimes2(n): if n > 1: if n == 2: return True if n % 2 == 0: return False for x in range(3, int(sqrt(n) + 1), 2): if n % x == 0: return False return True return False print(timeit.timeit("isPrimes1(100)", setup="from chapter01 import isPrimes1", number=10000)) print(timeit.timeit("isPrimes2(100)", setup="from chapter01 import isPrimes2", number=10000))
判断执行时间:
0.00563765699999999
0.001561703999999997
后一种方法将除 2 之外的偶数排除,大大减少了执行时间。
2.求 n 以内的素数
import timeit from math import sqrt import copy def listPrimes1(n): """ 初始所有一个n维数组 res 表示数都为素数。 从3开始将3的奇数倍标记成False,即不是素数。 之后对每一个素数此行上一步操作 这里我们不用管偶数倍,因为我们最后判定时默认所有偶数不是素数 """ if n < 3: if n == 2: return [2] return None res = [True] * n for i in range(3, int(n ** 0.5) + 1, 2): res[i * i::2 * i] = [False] * ((n - i * i - 1) // (2 * i) + 1) return [2] + [i for i in range(3, n, 2) if res[i]] def listPrimes2(n): ''' 计算n之内的素数 :param n: :return: ''' if n < 3: if n == 2: return [2] return None num_list = [x for x in range(2, n) if x%2 != 0] new_list = copy.copy(num_list) # new_list = [] for i in num_list: # new_list.append(i) for d in range(3, int(sqrt(i)) + 1,2): if i%d == 0: new_list.remove(i) break return [2] + new_list def listPrimes3(n): ''' 计算n之内的素数 :param n: :return: ''' if n < 3: if n == 2: return [2] return None return [2] + [p for p in range(2, n) if p %2 != 0 and 0 not in [p % d for d in range(2, int(sqrt(p)) + 1)]] print(timeit.timeit("listPrimes1(100)", setup="from chapter01 import listPrimes1",number=100)) print(timeit.timeit("listPrimes2(100)", setup="from chapter01 import listPrimes2", number=100)) print(timeit.timeit("listPrimes3(100)", setup="from chapter01 import listPrimes3", number=100))
整理得到三种实现方法,其中第一种方法执行时间最短。
0.000947919999999991
0.003774201000000005
0.004751936999999984
3.求 m 到 n 之间的素数
def mnPrimes1(m,n): if m == 1: num_list = [2] + [p for p in range(2, n) if p % 2 != 0 and 0 not in [p % d for d in range(2, int(sqrt(p)) + 1)]] if m >= 2: num_list = [p for p in range(m, n) if p % 2 != 0 and 0 not in [p % d for d in range(2, int(sqrt(p)) + 1)]] return num_list def mnPrimes2(m,n): num_list = [x for x in range(m, n) if x % 2 != 0 and x != 1] new_list = copy.copy(num_list) for i in num_list: for d in range(3, int(sqrt(i)) + 1, 2): if i % d == 0: new_list.remove(i) break if m == 2: new_list = [2] + new_list return new_list
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。