"""
题目:判断101-200之间有多少个素数,并输出所有素数。
质数(prime number)又称素数,有无限个。
质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。
""" import math def answer1():
"""
根据素数定义,一个一个判断
:return:
"""
print("输出一", end=":")
sumCount = 0
findTimes = 0
for i in range(101, 2000):
for j in range(2, i):
findTimes += 1
if i % j == 0:
break
else:
print(i, end=",")
sumCount += 1
print("共%d个" % sumCount, end=",")
print("共比较了%d次" % findTimes) answer1() def answer2():
"""
上述判断方法,明显存在效率极低的问题。对于每个数n,其实并不需要从2判断到n-1,我们知道,一个数若可以进行因数分解,
那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),据此,上述代码中并不需要遍历到n-1,遍历到sqrt(n)即可,
因为若sqrt(n)左侧找不到约数,那么右侧也一定找不到约数。
:return:
"""
print("输出二", end=":")
sumCount = 0
findTimes = 0
for i in range(101, 2000):
sqrtNum = int(math.sqrt(i))
for j in range(2, sqrtNum + 1):
findTimes += 1
if i % j == 0:
break
else:
print(i, end=",")
sumCount += 1
print("共%d个" % sumCount, end=",")
print("共比较了%d次" % findTimes) answer2() def answer3():
"""
方法(2)应该是最常见的判断算法了,时间复杂度O(sqrt(n)),速度上比方法(1)的O(n)快得多。最近在网上偶然看到另一种更高效的方法,暂且称为方法(3)吧,
由于找不到原始的出处,这里就不贴出链接了,如果有原创者看到,烦请联系我,必定补上版权引用。下面讲一下这种更快速的判断方法;
首先看一个关于质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等;
证明:令x≥1,将大于等于5的自然数表示如下:
······ 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ······
可以看到,不在6的倍数两侧,即6x两侧的数为6x+2,6x+3,6x+4,由于2(3x+1),3(2x+1),2(3x+2),所以它们一定不是素数,再除去6x本身,
显然,素数要出现只可能出现在6x的相邻两侧。这里有个题外话,关于孪生素数,有兴趣的道友可以再另行了解一下,由于与我们主题无关,暂且跳过。
这里要注意的一点是,在6的倍数相邻两侧并不是一定就是质数。
根据以上规律,判断质数可以6个为单元快进,即将方法(2)循环中i++步长加大为6,加快判断速度,代码如下: 高手无处不在啊 由上可得,只要从96开始,每6个计算一次
:return:
"""
print("输出三", end=":")
sumCount = 0
findTimes = 0
for i in range(102, 2000, 6):
for num in (i - 1, i + 1):
sqrtNum = int(math.sqrt(num))
for j in range(2, sqrtNum + 1):
findTimes += 1
if num % j == 0:
break
else:
print(num, end=",")
sumCount += 1
print("共%d个" % sumCount, end=",")
print("共比较了%d次" % findTimes) answer3() def answer4():
"""
上面的方法,高手还可以改进
因为上述可得,6x-1和6x+1坑定不会被6x,6x+2,6x+3,6x+4整除,弱它是素数,那么它也是被6x-1或6x+1整除
所以上面方法,里面的判断也可以跨6来判断
:return:
"""
print("输出四", end=":")
sumCount = 0
findTimes = 0
for i in range(102, 2000, 6):
for num in (i - 1, i + 1):
sqrtNum = int(math.sqrt(num))
for j in range(5, sqrtNum + 1, 6):
findTimes += 1
if num % j == 0 or num % (j + 2) == 0:
break
else:
print(num, end=",")
sumCount += 1
print("共%d个" % sumCount, end=",")
print("共比较了%d次" % findTimes) answer4() def answer5():
"""
排除偶数,数组统计
:return:
"""
print("输出五", end=":")
findTimes = 0
numList = []
for i in range(101, 2000, 2):
numList.append(str(i))
sqrtNum = int(math.sqrt(i))
for j in range(2, sqrtNum + 1):
findTimes += 1
if i % j == 0:
numList.pop()
break
print(",".join(numList), end=",")
print("共%d个" % len(numList), end=",")
print("共比较了%d次" % findTimes) answer5() class answer6:
"""
练习迭代器
""" def __init__(self):
"""
构造函数
"""
self.sumCount = 0
self.findTimes = 0
self.startNum = 102
self.endNum = 2000
print("输出六", end=":") def __iter__(self):
"""
迭代器
:return:
"""
return self def __next__(self):
"""
迭代器next
:return:
"""
if self.startNum > self.endNum:
raise StopIteration
for num in (self.startNum - 1, self.startNum + 1):
sqrtNum = int(math.sqrt(num))
for i in range(5, sqrtNum + 1, 6):
self.findTimes += 1
if num % i == 0 or num % (i + 2) == 0:
break
else:
print(num, end=",")
self.sumCount += 1
self.startNum += 6 answer = answer6()
for i in answer:
pass
print("共%d个" % answer.sumCount, end=",")
print("共比较了%d次" % answer.findTimes) def answer7():
"""
练习yield生成器,注意和answer6区域
"""
print("输出七", end=":")
startNum = 102
sumCount = 0
findTimes = 0
while startNum < 2000:
for num in (startNum - 1, startNum + 1):
sqrtNum = int(math.sqrt(num))
for i in range(5, sqrtNum + 1, 6):
findTimes += 1
if num % i == 0 or num % (i + 2) == 0:
break
else:
sumCount += 1
print(num, end=",")
yield num
startNum += 6
print("共%d个" % sumCount, end=",")
print("共比较了%d次" % findTimes) for i in answer7():
pass def answer8():
"""
练习数组生成器表达式
参考:http://blog.csdn.net/u014745194/article/details/70176117
:return:
"""
print("输出八", end=":")
numList = list(filter(lambda x: x not in set([i for i in range(101, 200) for j in range(2, i - 1) if not i % j]),
range(101, 200)))
print(numList, end=",")
print("共%d个" % len(numList)) answer8()

  

python学习——练习题(12)的更多相关文章

  1. python 学习笔记 12 -- 写一个脚本获取城市天气信息

    近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...

  2. python学习笔记12 ----线程、进程

    进程和线程的概念 进程和线程是操作系统中两个很重要的概念,对于一般的程序,可能有若干个进程,每一个进程有若干个同时执行的线程.进程是资源管理的最小单位,线程是程序执行的最小单位(线程可共享同一进程里的 ...

  3. Python学习(12)日期和时间

    目录 Python 日期和时间 时间元组 获取当前时间 获取格式化时间 格式化日历 获取某月日历 Time模块 日历模块 其他相关模块和函数 Python 日期和时间 Python 程序能用很多方式处 ...

  4. Python学习:12.Python字符串格式化

    字符串格式化 讲解Python这么久,也没有讲解Python的字符串的格式化,那我们今天就来了解一下python字符串格式化的强大之处. 首先我们先理解一下为什么要有字符串的格式化,就是为了方便字符串 ...

  5. python学习——练习题(4)

    """ 题目:输入某年某月某日,判断这一天是这一年的第几天? """ import datetime import time from fu ...

  6. python 学习笔记12(事件驱动、IO多路复用、异步IO)

    阻塞IO和非阻塞IO.同步IO和异步IO的区别 讨论背景:Linux环境下的network IO. 1.先决条件(几个重要概念) 1.1.用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32 ...

  7. python学习(12)使用正则表达式

    1.正则表达式知识 符号 解释 示例 说明 . 匹配任意字符 b.t 可以匹配bat / but / b#t / b1t等 \w 匹配字母/数字/下划线 b\wt 可以匹配bat / b1t / b_ ...

  8. Python学习总结12:sys模块

    sys模块常用来处理Python运行时配置以及资源,从而可以与前当程序之外的系统环境交互. 1. 导入及函数查看 >>> import sys #导入sys模块 >>&g ...

  9. Python学习笔记12—类

    典型的类和调用方法: #!/usr/bin/env Python # coding=utf-8 __metaclass__ = type #新式类 class Person: #创建类 def __i ...

随机推荐

  1. slam学习

    学习内容: 数学: 线性代数,概率论, 优化理论,离散数学, 李代数, 凸优化: 算法:   概率机器人, 机器人状态估计, 深度学习,非线性优化: 工程: c/c++ , python, ros, ...

  2. 【angular之起步】安装

    人生只有眼前的苟且. 所以为了远方,最近在策划一个大阴谋------做一个自己的网站,杂而全的. 各种胡思乱想了一周,先把页面写完了,没辙,就这个不用费太多脑子. 然后开始重头戏,就卡死了. angu ...

  3. 在exsi6.0中安装debian8.1 64位 无界面服务器版.

    之前介绍了exsi6.0的安装. 现在开始应用. 上一篇介绍的exsi6.0是安装在U盘上的系统.U盘为群联芯片,芯片型号为2251-50/30.容量为2G.发现容量足够用.比较节省成本. 现在开始为 ...

  4. HDU - 5324:Boring Class (CDQ分治&树状数组&最小字典序)

    题意:给定N个组合,每个组合有a和b,现在求最长序列,满足a不升,b不降. 思路:三位偏序,CDQ分治.   但是没想到怎么输出最小字典序,我好菜啊. 最小字典序: 我们倒序CDQ分治,ans[i]表 ...

  5. My Test about Mat

    一.创建Mat >Mat a = cv::Mat(2,2,CV_32S,1); output:  [1,1; 1,1] >Mat a = cv::Mat(2,2,CV_32SC3,1); ...

  6. pycharm中import动态链接库pyd有错误

    有红色波浪线提示unsolved reference云云 去setting里面设置interpreters,  在path里面添加对应的路径, 是包含对应头文件的路径, 不要忘记右边的小按钮去Relo ...

  7. service fabric docker 安装

    1. 镜像拉取 docker pull microsoft/service-fabric-onebox 2. 配置docker(daemon.json) { "ipv6": tru ...

  8. tidb 安装试用&&以及安装几个问题解决

    备注:    tidb 听说已经很长时间了,一直无安装部署(主要是不像cockrouchdb 不见那么简单)   1. 环境准备(官方建议使用6台机器) // 我的机器准备(阿里云的,同时大家最好选择 ...

  9. VS2010单元测试入门实践教程

    单元测试的重要性这里我就不多说了,以前大家一直使用NUnit来进行单元测试,其实早在Visual Studio 2005里面,微软就已经集成了一个叫Test的专门测试插件,经过几年的发展,这个工具现在 ...

  10. 可以随时查找的max栈和max队列——面试

    这是面试中比较常见的题目,max队列也是编程之美里的一道题 对于max的栈,有个比较简单的办法就是,每次入栈前判断栈顶元素与正在入栈的元素哪个大,哪个大就哪个入栈 对于队列,我们知道可以用两个栈来实现 ...