Python练习题100例(部分题目多解)12-13 从零开始的python学习之路(第5期)素数的不同找法,reduce方法和lambda匿名函数简介

本文介绍了Python中判断素数的两种方法,包括暴力遍历和线性筛法,详细解析了线性筛法的原理,并通过一道实践题目展示了如何使用reduce函数和lambda匿名函数进行数值计算。
摘要由CSDN通过智能技术生成

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 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值