Python快速上手练习题
本期难的是线性筛法,如果只是学习python基础不想接触算法可以不看
practice12
题目
判断101-200之间有多少个素数,并输出所有素数。
分析
**方法一:**暴力遍历从2到sqrt(n)的数,看是否整除,复杂度O(n^1.5)
**方法二:**线性筛法复杂度O(n),大概思路是对于任意的数,他的倍数肯定不是素数,并做标记。除此之外,比较重要的是避免重复计算,可以看下面的解释
对于快速筛法求素数,其步骤也可分为如下几个阶段:
(1).开一个n+1大小的数组num[n]来存放每一个元素的筛留情况(即对于num[n]的每个数与下标号相同,对于任意num[n]有num[n]=0,num[n]=1两种情况,如果num[n]=0则是素数,反之num[n]=1时是合数);
(2).再开一个数组prime[n]来存放筛出的素数以便最后输出结果;
(3).对于一个数k,总是进行从nprime[0]~nprimej,直到if(n%prime[j]==0)成立时break掉
这是这个算法的精髓所在,所以弄清楚原因是十分必要的!!!
对于一个数c=ab(b为c的最小质因数),当通过该算法的循环循环至cb时,易得此时c%b==0,如果此时继续循环至b后面的一个素数d,则有:cd=abd=(ad)b,因为d>b,所以ad>c。当循环从c继续查找到ad时我们发现当ad再次与素数b想乘时,就又对c*d进行了一次操作,出现了冗余,所以在if(n%prime[j]==0)成立时要将该层循环break掉;
举个例子,对于一个数9,92=18将18标记为合数,循环继续;93=27将27标记为合数,此时发现9%3=0,循环退出。如果将循环继续下去会出现筛除95=45的情况,而45=153,在15时会被在筛去一次,故不可行
(4).完成了算法中最重要的一步,最后只要将存放筛出的prime[ ]数组中的素数即可!
这段线性筛的解释来自于知乎(传送门),作者YangYH408
代码
#方法1
h = 0
leap = 1
from math